1.博弈问题
1.前提:每一步都是最优解的情况下,先手的那个人已经确定了胜负
用dp数组记录每一步操作后的结果,如果下一步会出现必输结果,那么说明执行这步操作的人必胜,因为必输结果的下一步操作后都是必胜的结果,所以在每一步操作都是最优解的情况胜负在第一步的时候已经确定了
2.例题(蓝桥杯15届a组省赛砍柴)
典型的博弈问题,我们先用一个数组将数据范围内的质数都保存进去,然后去更新dp数组,只有符合条件的质数中会出现必输结果,那么dp[i]一定等于1
3.代码
public class Main {
public static int[] res = new int[(int)1e5+1];//10的5次方以内的质数
public static int index = 0;//记录质数个数
public static void fun()
{
for(int i = 2;i<=1e5;i++)
{
int tmp = 0;
for(int j = 1;j<=i;j++)
{
if(i%j==0) tmp++;
}
if(tmp==2) {
res[index++] = i;
}
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int t = scan.nextInt();
int[] a = new int[t];
for(int i = 0;i<t;i++)
a[i] = scan.nextInt();
int[] dp = new int[(int)1e5+1];
dp[0] = dp[1] = 0;
dp[2] = 1;
fun();
for(int i = 2;i<=1e5;i++)
{
for(int j = 0;j<index;j++)
{
if(res[j]>i) break;
if(dp[i-res[j]]==0)
{
dp[i] = 1;
break;
}
}
}
for(int i = 0;i<t;i++)
System.out.println(dp[a[i]]);
scan.close();
}
}