bzoj 2798 [Poi2012]Bidding 博弈论+dp
题目大意
A和B两个人在玩一个游戏,这个游戏是他们轮流操作一对整数(x,y)。
初始时(x,y)=(1,0),可以进行三种操作:
- 将(x,y)变成(1,x+y)。
- 将(x,y)变成(2x,y)。
- 将(x,y)变成(3x,y)。
给定正整数n (n<=30,000),如果x+y>=n时就不能进行后两种操作。
如果某个人操作后y>=n,他就输掉了
分析
当一个人操作前x+y>=n时,他就输掉了
博弈论问题的一般方法
可以是操作后变成一个子问题
此题中每次操作相当于减少离n的距离
我们考虑dp
dp[i][j][k]表示y离n还有i,\(x=2^j*3^k\),是否必胜
做法
交互题
获得对面操作后,就直接执行对面操作
轮到自己,就选择一个让对手必败的操作
solution
for(i=1;i<=n;i++)
for(j=20;j>=0;j--)
for(k=20;k>=0;k--){
if(p2[j]*p3[k]>=i) f[i][j][k]=0;
else{
if(!f[i][j+1][k]||!f[i][j][k+1]||!f[i-p2[j]*p3[k]][0][0]) f[i][j][k]=1;
else f[i][j][k]=0;
}
}