#41607: 動態規劃解法


lbm00138 (bits/stdc++.h)

學校 : 臺北市立成淵高級中學
編號 : 270386
來源 : [61.71.41.184]
最後登入時間 :
2024-11-09 22:59:56
d999. 清空倉庫遊戲 -- 林口高中校內選訓 | From: [140.112.16.185] | 發表日期 : 2024-08-09 16:24

1. 使用動態規劃陣列 bb[1000000],先設 bb[0] 為 1 ,其他為 -1 (  表示尚未判斷  )。 bb[i]表示當有 i 個箱子時的勝負,1 表後手( Kitty )勝,0 表先手( OpenChan )勝。

2. 把第二排的整數( 一次拿的數量 ) 用 aa 陣列存並排序。

3. 先把所有的 bb[ aa[i] ] ( 0<= i <= n-1 ) 設為 0 ( 當箱子數量恰等於一次可拿的數量時,則先手方可以一次拿完,先手勝。 )

4.之後依序判斷 bb[1]~bb[1000000] :

4-1.當 bb [ i ] = -1 時,表示尚未判斷過,應執行判斷 。

4-2.先假設當前數量為後手勝,之後判斷小於等於 i 的 aa[ j ] ( 0<= j <= n-1 ) && ( i >= aa[ j ] ) 。

4-3. 若有任何 aa[ j ] 使得 bb[i-aa[j]] = 1 ,則結束判斷。表示 OpenChan 拿 aa[ j ] 個箱子換 Kitty 拿的時候可形成後手勝 ( 對 Kitty 不利的局面 ) ,則當前狀況為 OpenChan ( 先手方 ) 可勝。 設 bb[ i ] = 0。

4-4. 若沒有 , 則 OpenChan 不管拿多少箱子都無法形成後手勝 ( 對 Kitty 不利的局面 ) ,因此當前狀況為 Kitty ( 後手方 ) 可勝。 設 bb[ i ] = 1。

5 . 之後對每筆詢問 ai 檢查 bb[ ai ] 。若為 0 ,則輸出 OpenChan ,反之輸出 Kitty 。

 
ZeroJudge Forum