传送门

题意简述:m个石子,有两个队每队n个人循环取,每个人每次取石子有数量限制,取最后一块的输,问先手能否获胜。


博弈论+dp。

我们令f[i][j]f[i][j]f[i][j]表示当前第i个人取石子,石子还剩下j个时能否获胜。

显然如果有取法让轮到第(i+1)(i+1)(i+1) modmodmod 2n2n2n 个人有必败状态,那么的当前就是必胜状态。

再令k=(i+1)k=(i+1)k=(i+1) modmodmod 2n2n2n

于是f[i][j]=f[k][j−1]∣f[k][j−2]∣...∣f[k][max(0,j−m[i])]f[i][j]=f[k][j-1]|f[k][j-2]|...|f[k][max(0,j-m[i])]f[i][j]=f[k][j−1]∣f[k][j−2]∣...∣f[k][max(0,j−m[i])]

由于是循环dp,因此选择记忆化搜索要好些一些。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,s,m[25],f[25][10005];
inline int dfs(int p,int sum){
	if(~f[p][sum])return f[p][sum];
	if(!sum)return f[p][sum]=1;
	int up=min(m[p],sum);
	for(int i=1;i<=up;++i)if(!dfs((p+1)%n,sum-i))return f[p][sum]=1;
	return f[p][sum]=0;
}
int main(){
	while(scanf("%d",&n)&&n){
		scanf("%d",&s),memset(f,-1,sizeof(f)),n<<=1;
		for(int i=0;i<n;++i)scanf("%d",&m[i]);
		printf("%d\n",dfs(0,s));
	}
	return 0;
}

2018.09.25 poj2068 Nim(博弈论+dp)的更多相关文章

  1. POJ2068 Nim 博弈论 dp

    http://poj.org/problem?id=2068 博弈论的动态规划,依然是根据必胜点和必输点的定义,才明白过来博弈论的dp和sg函数差不多完全是两个概念(前者包含后者),sg函数只是mex ...

  2. 2018.09.25 bzoj2286: [Sdoi2011]消耗战(虚树+树形dp)

    传送门 又一道虚树入门题. 这个dp更简单啊. 直接记录每个点到1的距离,简单转移就行了. 代码: #include<bits/stdc++.h> #define N 250005 #de ...

  3. 2018.09.25 bzoj3572: [Hnoi2014]世界树(虚树+树形dp)

    传送门 虚树入门题? 好难啊. 在学习别人的写法之后终于过了. 这道题dp方程很好想. 主要是不好写. 简要说说思路吧. 显然最优值只能够从子树和父亲转移过来. 于是我们先dfs一遍用儿子更新父亲,然 ...

  4. 2018.09.25 51nod1597 有限背包计数问题(背包+前缀和优化)

    传送门 dp好题. 我认为原题的描述已经很清楚了: 你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装满这个背包的方案数有多少. 两种方案不同当且仅当存在至少一个数i满足第i种 ...

  5. 2018.09.01 poj3071Football(概率dp+二进制找规律)

    传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)" role=" ...

  6. 2018.09.01 独立集(树形dp)

    描述 给定一颗树(边权为1),选取一个节点子集,使得该集合中任意两个节点之间的距离都大于K.求这个集合节点最多是多少 输入 第一行是两个整数N,K 接下来是N-1行,每行2个整数x,y,表示x与y有一 ...

  7. 2018.09.25 bzoj1856: [Scoi2010]字符串(组合数学)

    传送门 如果有n==m的条件就是卡特兰数. 但现在n不一定等于m. 我们可以考虑用求卡特兰数一样的方法来求答案. 我们知道有一种求卡特兰数的方法是转到二维平面求答案. 这道题就可以这样做. 我们将这个 ...

  8. 2018.09.25 codeforces1053E. Euler tour(并查集+st表+模拟)

    传送门 毒瘤细节题. 首先考虑不合法的情况. 先把相同的值配对,这样就构成了一些区间. 那么如果这些区间有相交的话,就不合法了. 如何判断?DZYO安利了一波st表,我觉得很不错. 接着考虑两个相同的 ...

  9. 2018.09.25 poj3070 Fibonacci(矩阵快速幂)

    传送门 矩阵快速幂板题,写一道来练练手. 这一次在poj做题总算没忘了改万能库. 代码: #include<iostream> #include<cstdio> #define ...

随机推荐

  1. JSP生成WORD文档,EXCEL文档及PDF文档的方法

    转自:https://www.jb51.net/article/73528.htm 本文实例讲述了JSP生成WORD文档,EXCEL文档及PDF文档的方法.分享给大家供大家参考,具体如下: 在web- ...

  2. 某C电面记

    昨天突然接到某C的电话面试,有点措不及防.15分钟左右的电面后,直接收到了不合适的邮件通知,那个惨~~~~~~~~~~~~~~~ 记录回答得不是很好的几个问题: 1.自动化层面,你做了什么工作,给团队 ...

  3. salt常用模块及API

    saltstack提供了非常丰富的功能模块,涉及操作系统的基础功能,常用工具支持等,更多模块信息见官网模块介绍:https://docs.saltstack.com/en/latest/ref/mod ...

  4. 将*.sql数据库脚本导入到sqlserver中(sql文件导入sqlserver)

    在SqlServer中这个是用生成sql脚本生成的 要是在导入数据库用数据导入/导出向导导不进去 其实要用查询分析器来打开sql文件 然后执行就可以了

  5. triton,docker,mesos

    triton user: jill /root/.sdc/docker/jill 下 root@1f6af9d8-8ed9-e940-9c6c-d9505ca25896:~/.sdc/docker/j ...

  6. Cannot create inner bean '(inner bean)#67f903b5' of typ

    严重: Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error crea ...

  7. Loadrunner通过吞吐量计算每个用户需要的带宽

    Loadrunner通过吞吐量计算每个用户需要的带宽 运行一个场景,点击Analysis进行分析,使用分析报告中的Average Throughput(bytes/second)进行计算. 计算公式: ...

  8. spark开启远程调试

    一.集群环境配置 #调试Master,在master节点的spark-env.sh中添加SPARK_MASTER_OPTS变量 export SPARK_MASTER_OPTS="-Xdeb ...

  9. python笔记之str常用方法

    #Auther Bob#--*--conding:utf-8 --*--# s1 = 'aBcdE1d'# ============================================== ...

  10. java和数据结构的面试考点

    目标:不要有主要的逻辑错误.2遍以内bug free.注意代码风格 不要让面试官觉得不懂规矩 Java vs C++ Abstract class vs interface  pass by refe ...