vijos1196(博弈论)
来源:互联网 发布:knockout.js pdf 编辑:程序博客网 时间:2024/05/18 01:13
桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作。在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆(可以不相等)留给对方操作。游戏如此进行下去,糖果数会越来越少,最后必将出现这样一种情况:某人吃掉一堆糖果后发现另一堆里只剩一块糖果不能再分了。游戏规定此时该操作者吃掉最后这一块糖果从而取胜。
这个游戏是不公平的。对于任意一种初始状态,总有一方有必胜策略。所谓有必胜策略是指,无论对方如何操作,自己总有办法取胜。
Matrix67和Shadow将进行10次游戏,每一次游戏中总是Matrix67先进行操作。Matrix67想知道每一次游戏中谁有必胜策略。
直接分析,真是不好做,分析化找规律感觉挖掘的性质不够多,分析的不够全。
但是发现这题可以打表出来,以此找规律!
打表实际上就是暴力喽,f【i】表示分大小为i的堆,先手是否有必胜策略。经过分析发现f【i】是从f【1~i/2】推过来的。
那么博弈论dp搞一搞,70分就有了。以下有注意点。
#include<cstdio>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;int n,m;bool f[12005];void init(){f[1]=true;for (int i=2;i<=10000;i++){for (int j=1;j<=i/2;j++)//枚举它分成的所有情况,在所有情况中选对于当前先手的最优,这也就是博弈论dp的思路。{int x=j,y=i-j;f[i]=f[i]||(!(f[x]||f[y]));//这里的“非”必须是!号,~号是不行的!!!!!!}}}int main(){init();for (int i=1;i<=200;i++) printf("%d %d\n",i,f[i]);while (scanf("%d%d",&n,&m)!=EOF){if (f[n]||f[m]) printf("Matrix67\n");else printf("Shadow\n");}return 0;}
打出f【i】的表,发现。。。五个为一循环,不用dp了,o(1)直接算就行
1 1
2 0
3 0
4 1
5 1
6 1
7 0
8 0
9 1
10 1
11 1
12 0
13 0
14 1
15 1
16 1
17 0
18 0
19 1
20 1
21 1
22 0
23 0
#include<cstdio>#include<cmath>#include<cstdlib>#include<algorithm>#include<cstring>using namespace std;bool f(int n){n=n%5;switch(n){case 0:case 1:case 4:return true;case 2:case 3:return false;}}char s1[10005],s2[10005];int len1,len2;int main(){while (scanf("%s%s",s1,s2)!=EOF){len1=strlen(s1);len2=strlen(s2); if (f(s1[len1-1]-'0')||f(s2[len2-1]-'0')) printf("Matrix67\n");else printf("Shadow\n");}return 0;}
总结
1:博弈论问题(这里适合nim游戏)的主体思路
一 :主要思路就是从小范围情况向大范围情况推,由此进行归纳和总结
二:分情况手推小范围的数据,模拟nim游戏的运行,在计算的过程中感受后来状态和之前状态之间的关系。
三:有些题看着数据范围过大(此题的数达到10000位),可能最终答案可以从输入的这些数据本身找答案,不必想像弈论dp从前忘后推了,实际上这就是要我们找规律
2:这题规律,真心不好推,直接找规律不行,分析题目性质找规律也很难,怎么办?
写暴力,输出答案找规律。考场上也是要这样,写暴力程序找规律(这里是用博弈论dp写了70分的数据,10000的数据就是给这种做法的)。
3:博弈论dp才是更通用的做法,找规律只是对这种做法的优化而已(感觉很多给数据70分和100分的两种,70分就是好不容易想到的主要想法,而100分就是对这个算法的优化),博弈论dp从小往大推,一定要保证先后手都是最优策略,当前=(所有情况的最差策略(保证后手最优策略))中的最优策略(保证先手最优策略)。//只可意会不可言传,蓝书67页”sum游戏“的做法可将这个思想进行很好的概括,这题很便于意会了!
- vijos1196(博弈论)
- vijos1196题解
- 博弈论的局限性(博弈论的诡计)
- 博弈论(1):囚徒困境中的博弈论
- 博弈论相关(转)
- hdoj 2147(博弈论)
- 博弈论(1)
- Nim Game (博弈论)
- 博弈论(一)
- 博弈论(二)
- poj_1082_Calendar Game(博弈论)
- SG函数(博弈论)
- 博弈论 ACM(转)
- 博弈论 (SG函数)
- 博弈论(高僧斗法)
- marshmallow (博弈论)
- 博弈论(转)
- Uva 11489(博弈论)
- 专业化基础——大学计算机基础
- 字符连接
- 利用新架构整合我们的首页和登录页
- MySQL无法通过IP访问,只能使用localhost
- 【河南省第九届ACM程序设计大赛 信道安全 +zzulioj 1925 信道安全 +邻接表 +队列 】
- vijos1196(博弈论)
- float、double精度丢失
- Visio画图 +无空白PDF+Latex
- Java——多态性
- 93. Restore IP Addresses
- 高仿美团app,浮动layout滑动到顶部
- 设计模式学习(十一)————外观模式
- POJ 3784 动态求中位数
- onActivityResult()方法的执行问题