题目:http://acm.hdu.edu.cn/showproblem.php?pid=4111
题意:有N堆石头,可以把两堆合成一堆,也可以把一堆去掉一个。
由于总数不变,最终总是要一个个拿完。那么有机会获胜的一方,肯定是先要把所有的合在一起,那么最终就拼奇偶数了。所以双方都要合并。总共就是sigma(ai)+n-1
然而,特殊情况出现了。当某些堆石子只有一颗的时候呢?只要本来要输的那个人有机会将这颗石子拿走,本来要赢的那个孩子就没有机会将这一堆合并了!整体奇偶性一改变,输家可能变成了赢家!
因此把一颗石子一堆的情况单独拎出来,剩下的合并成一堆。状态为sg[i][j]。i代表有i个1颗石子组成的小堆,j代表剩下石子合并成一个大堆后的个数。每个状态最多有四种后继:1、拿走大堆的一颗石子。2、拿走一个小堆。3、将一个小堆和大堆合并。4、将两个小堆合并
sg[i][j]=mex{ sg[i][j-1],sg[i-1][j],sg[i-1][j+1],sg[i-2][j+3](j!=0时) 或 sg[i-2][2](j=0时)}
注意一下状态转移的条件即可。
由于只是单个游戏,因此不需要计算sg值,只需标记必胜必败点即可
代码:
#include
#include
#include
using namespace std;
int dp[55][50010];
int Win(int i,int j){
}
int main(){
}