题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1413
题意:n堆石子排成一排。每次只能在两侧的两堆中选择一堆拿。至少拿一个。谁不能操作谁输。
思路:参考这里。
int f1[N][N],f2[N][N],n,a[N]; void deal() { RD(n); int i,j,k; FOR1(i,n) RD(a[i]),f1[i][i]=f2[i][i]=a[i]; int p,q,x; for(k=2;k<=n;k++) for(i=1;i+k-1<=n;i++) { j=i+k-1; p=f1[i][j-1]; q=f2[i][j-1]; x=a[j]; if(x==q) f1[i][j]=0; else if(x<p&&x<q||x>p&&x>q) f1[i][j]=x; else if(p<q) f1[i][j]=x+1; else f1[i][j]=x-1; p=f2[i+1][j]; q=f1[i+1][j]; x=a[i]; if(x==q) f2[i][j]=0; else if(x<p&&x<q||x>p&&x>q) f2[i][j]=x; else if(p<q) f2[i][j]=x+1; else f2[i][j]=x-1; } if(n==1) puts("1"); else PR(f2[1][n-1]!=a[n]); } int main() { rush() deal(); }
BZOJ 1413 取石子游戏(DP),布布扣,bubuko.com
时间: 2024-10-10 00:32:04