2018.09.25 poj2068 Nim(博弈论+dp)
传送门
题意简述: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)的更多相关文章
- POJ2068 Nim 博弈论 dp
		
http://poj.org/problem?id=2068 博弈论的动态规划,依然是根据必胜点和必输点的定义,才明白过来博弈论的dp和sg函数差不多完全是两个概念(前者包含后者),sg函数只是mex ...
 - 2018.09.25 bzoj2286: [Sdoi2011]消耗战(虚树+树形dp)
		
传送门 又一道虚树入门题. 这个dp更简单啊. 直接记录每个点到1的距离,简单转移就行了. 代码: #include<bits/stdc++.h> #define N 250005 #de ...
 - 2018.09.25 bzoj3572: [Hnoi2014]世界树(虚树+树形dp)
		
传送门 虚树入门题? 好难啊. 在学习别人的写法之后终于过了. 这道题dp方程很好想. 主要是不好写. 简要说说思路吧. 显然最优值只能够从子树和父亲转移过来. 于是我们先dfs一遍用儿子更新父亲,然 ...
 - 2018.09.25 51nod1597 有限背包计数问题(背包+前缀和优化)
		
传送门 dp好题. 我认为原题的描述已经很清楚了: 你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装满这个背包的方案数有多少. 两种方案不同当且仅当存在至少一个数i满足第i种 ...
 - 2018.09.01 poj3071Football(概率dp+二进制找规律)
		
传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)" role=" ...
 - 2018.09.01 独立集(树形dp)
		
描述 给定一颗树(边权为1),选取一个节点子集,使得该集合中任意两个节点之间的距离都大于K.求这个集合节点最多是多少 输入 第一行是两个整数N,K 接下来是N-1行,每行2个整数x,y,表示x与y有一 ...
 - 2018.09.25 bzoj1856: [Scoi2010]字符串(组合数学)
		
传送门 如果有n==m的条件就是卡特兰数. 但现在n不一定等于m. 我们可以考虑用求卡特兰数一样的方法来求答案. 我们知道有一种求卡特兰数的方法是转到二维平面求答案. 这道题就可以这样做. 我们将这个 ...
 - 2018.09.25 codeforces1053E. Euler tour(并查集+st表+模拟)
		
传送门 毒瘤细节题. 首先考虑不合法的情况. 先把相同的值配对,这样就构成了一些区间. 那么如果这些区间有相交的话,就不合法了. 如何判断?DZYO安利了一波st表,我觉得很不错. 接着考虑两个相同的 ...
 - 2018.09.25 poj3070 Fibonacci(矩阵快速幂)
		
传送门 矩阵快速幂板题,写一道来练练手. 这一次在poj做题总算没忘了改万能库. 代码: #include<iostream> #include<cstdio> #define ...
 
随机推荐
- angular 参考文档
			
https://www.w3schools.com/angular/ 参考二: https://www.angular.cn/guide/reactive-forms
 - 奇技淫巧:在spring官网上下载历史版本的spring插件,springsource-tool-suite
			
转自:https://blog.csdn.net/PacosonSWJTU/article/details/80959689 目前spring官网(http://spring.io/tools/sts ...
 - nodejs 获取文件夹中所有文件、图片 名
			
//获取项目工程里的图片 var fs = require('fs');//引用文件系统模块 var image = require("imageinfo"); //引用image ...
 - PowerDesigner 连接oracle数据库
			
TNS Service Name 不是监听名称,填写这个格式就可以了 10.0.0.2:1521/orcl
 - as3 判断鼠标移动方向
			
import flash.events.MouseEvent; var odx:Number=mouseX; var ody:Number=mouseY; stage.addEventListener ...
 - python传参数
			
Python参数传递采用的肯定是“传对象引用”的方式.这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对 ...
 - python引用,浅复制,深复制
			
引用:可以按照指针理解 copy:只复制父元素,所以如果一个列表嵌套了列表,那么浅复制后原变量和复制后的变量还是引用相同的子元素,子元素修改后,两个变量还会对应改变. deepcopy:复制父元素和子 ...
 - mongodb基础学习4-游标
			
今天来讲讲游标的操作,可以先获取一组文档,再对每一个文档进行操作. 因为mongodb底层是js引擎,所有可以像操作js一样操作mongodb,比如插入数据 游标的使用:声明游标,判断是否有下一条数据 ...
 - Implementing the On Item Checked Event for the TListView Control
			
The TListView Delphi control displays a list of items in a fashion similar to how Windows Explorer d ...
 - apply和call用法
			
资料来源:http://blog.csdn.net/business122/article/details/8000676 Js apply方法详解 我在一开始看到javascript的函数apply ...