POJ 2068 NIm (dp博弈,每个人都有特定的取最大值)
2024-08-31 20:48:32
题目大意:
有2n个人,从0开始编号,按编号奇偶分为两队,循环轮流取一堆有m个石子的石堆,偶数队先手,每个人至少取1个,至多取w[i]个,取走最后一个石子的队伍输。问偶数队是否能赢。
分析:
题目数据不大很容易就可以联想到DP博弈,设dp[i][j]表示轮到第i个人,还有j个石子的情况下他所属队伍是否能赢。
那么如果存在一个x,使第i个人取了x个石子后第(i+1)%2n个人无论如何都败,那么他就可以赢;若不存在则输。即是:
dp[i][j]=(dp[(i+1)%2n][j-1]&dp[(i+1)%2n][j-2]&……&dp[(i+1)%2n][j-w[i]])^1;
由于有循环,所以直接dp不好做,改用记忆化搜索。
#include<stdio.h>
#include<string.h>
int dp[][],a[],n;
int dfs(int id , int val)
{
if(val==)
return dp[id][val]=;
if(dp[id][val]!=-)
return dp[id][val];
dp[id][val]=;
for(int i= ; i<=a[id] ; i++)
{
if(val<i)
break;
if(!dfs((id+)%(*n),val-i))
dp[id][val]=;
} return dp[id][val];
}
int main( )
{
int m;
while(scanf("%d",&n)!=EOF)
{
if(n==)
break;
scanf("%d",&m);
for(int i= ; i<*n ; i++)
scanf("%d",&a[i]);
memset(dp,-,sizeof(dp));
printf("%d\n",dfs(,m)); }
}
最新文章
- Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级
- 利用fis3自动化处理asp.net项目静态资源时遇到的一个编码问题
- Android 5.X新特性之RecyclerView基本解析及无限复用
- JavaWeb路径问题打包总结--小心出门右转404
- 在RichFaces中使用Facelets模板
- 30天C#基础巩固----查找XML文件元素
- SELECTION-SCREEN 文本丢失
- ASP.NET MVC统一异常处理
- java读取properties文件的内容
- Android 怎样使用API
- eclipse.ini配置eclipse的启动参数
- 【转载】TCP协议疑难杂症全景解析
- 编写存储过程导出oracle表数据到多个文本文件
- Spark源码分析之Spark-submit和Spark-class
- Java基础学习笔记十六 集合框架(二)
- SSM整合Netty5.0详细说明
- SyntaxError: invalid character in identifier(Python)
- week4_1
- Shell 实现多线程(多任务)
- MySQL常用内置变量