您的位置:首页 > 其它

poj解题报告——2068

2015-08-16 11:34 316 查看
题目是说有2*n个人坐在一起,分为2组交叉坐,共有s个石头,每次挨着取石头,石头不能超过当前人取最大的限制,若谁取到最后一个石头,那么就算失败。现在问我方是否能胜利,胜利输出1,失败输出0。

dp[i][j]表示为第i个人剩下j个石头的胜负情况。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=8200;
int dp[21][maxn],n,a[21],tot;
int min(int a,int b)
{
return a<b?a:b;
}
int DFS(int index,int res)
{
if(index==n+1)
index=1;
if(res==1)
return 0;
if(res<=a[index])
return dp[index][res]=1;;
if(dp[index][res]!=-1)
return dp[index][res];
for(int i=1;i<=min(res,a[index]);i++)
if(!DFS(index+1,res-i))
return dp[index][res]=1;
return dp[index][res]=0;
}
int main()
{
while(scanf("%d",&n)&&n)
{
memset(dp,-1,sizeof(dp));
scanf("%d",&tot);
n*=2;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
if(DFS(1,tot))
printf("1\n");
else
printf("0\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: