POJ 2960 S-Nim(SG+记忆化搜索)
来源:互联网 发布:linux系统安装方法 编辑:程序博客网 时间:2024/05/21 09:35
题目链接:http://poj.org/problem?id=2960
题目大意:在尼姆游戏的基础上,把能够取的石头个数限定了。用SG函数实现,每个计算出的sg值都等价于原尼姆游戏中的一堆的石子数。
某一堆的石子数取走一定数量k后可以得到一个新石子堆对应的sg值,也就是原石堆的所有分支的其中一个。
这时候后手可以根据实际情况处理。sg值是子分支中没有出现过的最小整数。
比如 原sg = 3的分支有sg = 0, sg = 1, sg = 2,那么只要满足sg的异或值为0,必定有另外一个sg=3,只需要将其也变成对方所变成的分支即可。
又如原sg = 3的分支有sg = 0, sg = 1, sg = 2,sg = 4……sg=k,而另外一个sg=3的分支为sg = 0, sg = 1, sg = 2。对方把3变成了k(k>3),而我方只要把k再变回3就可以了。这样仍是成对存在了。
为什么用dp打表WA了,没找到问题,以后还是用记忆化搜索吧,时间复杂度一样的,也可能是我细节写的不对。
#include<vector>#include<cstring>#include<cmath>#include<cstdio>#include<algorithm>using namespace std;const int maxn = 100;int match[maxn + 5];int h[maxn + 5];int sg[maxn * maxn + 5];int m, l, k;int dfs(int p) { if(sg[p] != -1) { return sg[p]; } bool vis[maxn*maxn+5] = {0}; for (int i = 0; i < k; i ++) { int t = p - match[i]; if(t >= 0) { sg[t] = dfs(t); vis[sg[t]] = 1; } } for (int i = 0; ; i ++) { if(vis[i] == 0) { return i; } }}int main() { while (scanf("%d", &k) != EOF, k) { for (int i = 0; i < k ; i ++) { scanf("%d", match + i); } scanf("%d", &m); char ans[maxn + 5]; memset(sg, -1, sizeof(sg)); for (int i = 0 ; i < m; i ++) { scanf("%d", &l); for (int j = 0; j < l; j ++) { scanf("%d", h + j); } int res = 0; /** dfs */ sg[0] = 0; for (int i = 0; i < l; i ++) { if(sg[h[i]] == -1) { sg[h[i]] = dfs(h[i]); } res ^= sg[h[i]]; } /** dp */// sort(match, match + k);// memset(sg, 0, sizeof(sg));// bool _hash[maxn * maxn + 5] = {0};// int mx = *max_element(h, h + l);// for (int i = 0; i <= mx; i ++) {// memset(_hash, 0, sizeof(_hash));// for (int j = 0; match[j] <= i && j < k; j ++) {// _hash[sg[i-match[j]]] = 1;// }// for (int j = 0;; j ++) {// if(_hash[j] == 0) {// sg[i] = j;// break;// }// }// }// for (int i = 0; i < l; i ++) {// res ^= sg[h[i]];// } ans[i] = res ? 'W':'L'; } ans[m] = 0; puts(ans); } return 0;}
0 0
- POJ 2960 S-Nim(SG+记忆化搜索)
- poj-2960 S-Nim (博弈SG)
- POJ-2960-S-Nim(SG函数)
- POJ 2311-Cutting Game(Nim博弈-sg函数/记忆化搜索)
- HDU 1536 & POJ 2960 S-Nim(博弈 SG)
- poj 2960 S-Nim(博弈,SG值)
- POJ-2960(S-Nim)——博弈论,SG函数
- POJ 2960 S-Nim (SG定理的典型应用)
- poj 2960 S-Nim(sg函数)
- POJ 2960 S-Nim 【博弈论,SG函数】
- sg函数 poj 2960 S-Nim
- POJ 2960 S-Nim 博弈论,SG函数
- POJ 2960 S-Nim <SG函数>
- POJ 2960 S-Nim (sg函数)
- hdu 1536 S-Nim|| poj 2960 S-Nim (sg函数)
- POJ 2068 Nim (记忆化搜索+组合博弈)
- HDOJ S-Nim 1536&POJ S-Nim 2960【求SG函数+Nim游戏】
- HDU 1536 && POJ 2960 S-Nim SG函数
- HDOJ 1241 Oil Deposits (DFS)
- Hive over HBase和Hive over HDFS性能比较分析
- 动态规划——最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串最小编辑距离日记整理
- hdu2066一个人的旅行【最短路dijkstra&&SPFA】
- [Linux]工作中常见的命令
- POJ 2960 S-Nim(SG+记忆化搜索)
- hdu-5407(多校2015)
- UC-Android逆向工程师 面试题1的分析
- 九度oj 1103
- 第K短路
- golang-发送邮件
- 2.15 求二维数组的子矩阵的最大和
- C语言中do...while(0)的妙用-避免goto
- NYOJ 709 异 形 卵(区域最大值,水题)