一个简单的动态规划问题。
动态规划问题都会带有一定的规律性,所以首先进行简单的推导:
N=1时,Alice没得选择,false;
N=2时,Alice先手选择1,此时N=1,所以Bob没得选,true;
N=3时,Alice先手选择1,此时N=2,所以Bob选择1,N=1,Alice没得选,false;
N=4时,Alice可以选择1或2,选择1的话,N=3,从上面可以看出此时Bob必败,故true;若选择2的话,N=2,Bob选择1,Alice没得选,false;(但是因为题目中说两人始终保存最佳状态玩游戏,所以两人在可以赢的情况下,不会输,故不会选择2);
由此可以发现规律,如果Alice选择s时可以获胜,那么在N=N-s时,Alice必败。则得到以下代码:
class Solution {
public boolean divisorGame(int n) {
if(n==1)//因为n的大小是从1开始的,所以对这种情况进行特殊处理,以免dp[2]处报错
return false;
boolean [] dp = new boolean[n+1];
dp[1]=false;
dp[2]=true;
for(int i=3;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(i%j == 0 && !dp[i-j])//根据上面所说,反过来就是如果Alice在N=n1时失败false,则在N=n1+s时必定获胜,其中s满足条件0<s<N,N%s==0
{
dp[i]=true;
break;
}
}
}
return dp[n];
}
}