bzoj 2798 [Poi2012]Bidding 博弈论+dp

题目大意

A和B两个人在玩一个游戏,这个游戏是他们轮流操作一对整数(x,y)。
初始时(x,y)=(1,0),可以进行三种操作:

  1. 将(x,y)变成(1,x+y)。
  2. 将(x,y)变成(2x,y)。
  3. 将(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;
    }
}
posted @ 2017-02-16 20:22  _zwl  阅读(263)  评论(0编辑  收藏  举报