poj2068 Nim(博弈|dp)
2018-02-10 14:28
363 查看
题目链接
分析:
双方都有操作集的Nim游戏
没有什么好办法,所以就想计算SG值
但是双方的操作并不等价(双方的操作集不一样)
我们没有办法直接计算SG函数
解决方法:记忆化搜索
设计状态:f[i][j]f[i][j]表示第ii个人,还有jj个石子的情况下是否能赢
直接搜索即可
终止状态:
原来SG函数还可以用DP计算
分析:
双方都有操作集的Nim游戏
没有什么好办法,所以就想计算SG值
但是双方的操作并不等价(双方的操作集不一样)
我们没有办法直接计算SG函数
解决方法:记忆化搜索
设计状态:f[i][j]f[i][j]表示第ii个人,还有jj个石子的情况下是否能赢
直接搜索即可
终止状态:
if (rst==1) return 0; //必败态 if (rst<=a[x]) return 1; //必胜态
tip
真的涨姿势了原来SG函数还可以用DP计算
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int N=10002; int n,m,a[25]; int f[25] ; int dfs(int x,int rst) { if (x>2*n) x=1; if (rst==1) return f[x][rst]=0; if (rst<=a[x]) return f[x][rst]=1; if (f[x][rst]!=-1) return f[x][rst]; for (int i=1;i<=min(rst,a[x]);i++) if (!dfs(x+1,rst-i)) //后继状态有必败态 return f[x][rst]=1; return f[x][rst]=0; } int main() { while (scanf("%d",&n)!=EOF&&n) { memset(f,-1,sizeof(f)); scanf("%d",&m); for (int i=1;i<=2*n;i++) scanf("%d",&a[i]); if (dfs(1,m)) printf("1\n"); else printf("0\n"); } return 0; }
相关文章推荐
- POJ2068_Nim_DP博弈
- [SPOJ IGAME Interesting Game]Nim 博弈+数位DP
- dp博弈______Nim( poj 2068 )
- POJ 2068 Nim 博弈DP
- poj 2068 NIM 博弈+dp
- POJ 2068 NIM (博弈DP)
- poj 2068 NIM (博弈DP)
- poj 2068 Nim(博弈dp)
- POJ 2068 Nim (博弈和DP本是一家=-=)
- UVA 1559 - Nim(博弈dp)
- poj 2068 Nim(博弈dp)
- poj2068 Nim (博弈)
- 巴什博弈 威佐夫博弈 nim博弈 斐波那契博弈
- 1031 - Easy Game(博弈dp)
- HDU 1907 John nim博弈变形 Anti-SG
- 博弈之Nim游戏
- poj 2234 博弈-Nim
- [ACM] hdu 1850 Being a Good Boy in Spring Festival(Nim博弈)
- 携程第二场 Poj 1182 食物链(带权并查集) Poj 1948 Triangular Pastures Poj(dp二维背包) 1740 A New Stone Game(博弈)
- 2960 S-Nim 取石子的个数有限定集合尼姆博弈