nova君陷入了困境,因為他無法在ps4遊戲上憑藉操作戰勝對手。機智如他,只好和對手博弈了!
nova君拿出的方案和以往有些不一樣,他說:「你可以決定石子數量和石子的取法,我來決定先後手,這樣非常公平。」他的對手覺得nova君說的有道理,於是不僅決定了每局的石子數量,還給出了k個數字,表示每次可以任意取走數量等同於這k個數字中乙個的石子,k中一定有乙個為1。先取完者為勝。
現在很急很關鍵,快幫nova君看看他到底應該先手還是後手才能戰勝對手。
每組測試資料兩行。
第一行兩個整數n和k,第二行k個整數,意義如題目描述。
n<=100000,k<=15
對於每組資料,輸出一行,為nova應該採取的先後手 sente \ gote
4 3
1 2 3
1 11
gote
sente
解題思路:給定n個石頭,和k種去除石頭的方式,每種方式可以去除一定量的石頭, 現在sente(簡稱s),gote(簡稱o),s先手,o後手,每次每個人能選擇一種去除石頭的方式,誰去除最後一堆誰就贏了。要求出必勝之人是誰。
分析:1.用乙個dp陣列記錄,對於先手者能取到的記錄為1,後手者為0.
2.初始dp陣列都為0,遍歷1到n,如果dp[i]為0,說明上一手是後手取得,這樣先手就能取,把dp[i]變為1,由於是從1到n,這樣每個狀態記錄時,前面的都已經記錄好了,所以是可行的.
3.這樣最後只需要判斷dp[n]是1,還是0,就可以判斷是先手勝還是後手勝了。
狀態轉移方程為:if (i - mjmj[j] >= 0 && !dp[i - mjmj[j]]) dp[i] = 1.
給出**:
1 #include 2#define max 1000010
3int dp[max],mjmj[15];4
5int
n,m,i,j;
6int
main()716
for (i=1;i<=n;++i)
1725}26
}27if(dp[n])
28 printf("
sente\n");
29else
30 printf("
gote\n");
31}32return0;
33 }
推薦部落格:
推薦部落格:
動態規劃 除數博弈
愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字 n 在每個玩家的回合,玩家需要執行以下操作 選出任一 x,滿足 0 x n 且 n x 0 用 n x 替換黑板上的數字 n 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回 true,否則返回...
動態規劃 1025 除數博弈
難度easy 愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字 n 在每個玩家的回合,玩家需要執行以下操作 選出任一 x,滿足 0 x n 且 n x 0 用 n x 替換黑板上的數字 n 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回 tr...
動態規劃系列 1025 除數博弈
package test 動態規劃系列 1025.除數博弈 愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字 n 在每個玩家的回合,玩家需要執行以下操作 選出任一 x,滿足 0 x n 且 n x 0 用 n x 替換黑板上的數字 n 如果玩家無法執行這些操作,就會輸掉遊...