还有一天就结束了。。QWQ

好快啊。

昨天没讲完的博弈论DP:

一个标准的博弈论dp,一般问的是是否先手赢。

博弈论最关键的问题:dp过程。

对于一个问题,一定有很多状态,每个状态可以转移到其他的一些状态。如果存在一个状态,且不能转移到其他状态,那么我们设这个状态为必败态,那么他相邻的能够转移到必败态的状态因为只有一种转移方式,那么一定为必胜态,(假设操作双方选手绝顶聪明,每一步都朝着最优状态走),如此这样交替下去,推到开始状态,就可以判断了。

怎么转换?

对于一个节点以及他所有子节点来讲,如果子节点全部为true(对手的必胜态),那么当前节点为你的必败态。

如果子节点中有一个false(对手必败态),那么当前节点就是你的必胜态。

于是我们用dfs记忆化枚举并dp:

#include<iostream>

using namespace std;

bool f[][],g[][];

bool dfs(int i,int j)
{
if (i==) return false;
if (g[i][j]) return f[i][j];
g[i][j]=true;f[i][j]=false;
for (int r=;r<=i && r<=k*j;r++)
if (dfs(i-r,r) == false) f[i][j]=true;
return f[i][j];
} int main()
{
cin >> s >> k;
for (int a=;a<s;a++)
if (dfs(s-a,a) == false)
{
cout << "Alice" << endl;
return ;
}
cout << "Bob" << endl; return ;
}

这个题用到sg函数:sg[n]表示从n往下到一个能取到的最低的值中最小的没有出现过的非负整数的值,

suchas:在序列2 5 6 7中,sg[4]=0,在序列1 2 3 4 6中,sg[5]=5;

这个东西有什么用?

SG函数可以解决大多数博弈问题,当然也可以通过SG函数找规律,然后计算结果。

答案是把所有奇数堆都取出来并求sg函数并亦或,如果答案为0,先手必败。

至于sg的正确性的话。。。

zhx:“这个东西如果你去看的话没有2个小时你是看不下来的,如果想看懂全部原理和证明的话没有2天是不行的。”.

我看了看,

所以证个锤子。背过模板万事皆有可能。

各种例题:

sg函数求法:

下午考试,爆零警告。

清北学堂提高组突破营游记day6的更多相关文章

  1. 清北学堂提高组突破营游记day3

    讲课人更换成dms. 真的今天快把我们逼疯了.. 今天主攻数据结构, 基本上看完我博客能理解个大概把, 1.LCA 安利之前个人博客链接.之前自己学过QWQ. 2.st表.同上. 3.字符串哈希.同上 ...

  2. 清北学堂提高组突破营游记day5

    长者zhx来啦.. (又要送冰红茶了...) zhx一上来就讲动态规划...是不是要逼死人.... 动态规划: 最简单的例子:斐波那契数列.因为他是递推(通项公式不算)的,所以前面的已经确定的项不会影 ...

  3. 清北学堂提高组突破营游记day4

    今天主攻图论. 对于这道题,30分做法是暴力搜索全部来判断是否有异样. 对于满分做法,利用带权并查集.? 又带我们串了一边LCA 安利个人LCA博客. spfa代码.原理:循环队列. 然后是floyd ...

  4. 清北学堂提高组突破营考试T1

    题目如下: (想要作弊的后几届神仙们我劝你们还是别黈了,这个题如果你们不会只能证明你们上错班了). 好,题目看完了,发现是一道大模拟(%你)题,于是我们按照题目说的做: #include<ios ...

  5. 清北学堂提高突破营游记day1

    上午7点半到的国防宾馆,8点开始的培训. 讲课人林永迪. 没错就是这个人: 他推荐的教辅:刘汝佳紫书,算法导论(也就看看..),刘汝佳白书 先讲模拟.(貌似就是看题论题. 然后贪心. 贪心没有固定的模 ...

  6. 清北学堂提高突破营游记day2

    先水了一下昨天没讲完的贪心. 然后今天讲的分治. 安利自己水的二分与三分. 二分一定要满足有序.三分适合解决单峰函数问题. 第一道题借教室.运用差分和二分查找. 三分: P1731 [NOI1999] ...

  7. <知识整理>2019清北学堂提高储备D2

    简单数据结构: 一.二叉搜索树 1.前置技能: n/1+n/2+……+n/n=O(n log n)  (本天复杂度常涉及) 2.入门题引入: N<=100000. 这里多了一个删除的操作,因此要 ...

  8. <知识整理>2019清北学堂提高储备D1

    一.枚举: 枚举是最简单最基础的算法,核心思想是将可能的结果都列举出来并判断是否是解. 优点:思维简单,帮助理解问题.找规律.没头绪时 缺点:时空复杂度较高,会有很多冗余的非解(简单的枚举几乎没有利用 ...

  9. <知识整理>2019清北学堂提高储备D3

    全天动态规划入门到入坑... 一.总概: 动态规划是指解最优化问题的一类算法,考察方式灵活,也常是NOIP难题级别.先明确动态规划里的一些概念: 状态:可看做用动态规划求解问题时操作的对象. 边界条件 ...

随机推荐

  1. 在 Android 中进程的级别有哪些?

    a) Foreground processb) Visible processc) Service processd) Background processe) Empty process

  2. oracle 四舍五入 取得的数值

    SELECT ROUND( number, [ decimal_places ] ) FROM DUAL 说明: number : 将要处理的数值 decimal_places : 四舍五入,小数取几 ...

  3. Java编程思想——标准 I / O

    将Syetem.out转换成PrintWriter 标准I/O重定向: 控制台信息量大,滚动快,查看困难 setIn(InputStream) setOut(...) setErr(...) 新I/O ...

  4. SpringCloud常用注解有哪些?

    @Mapper: 注解写在你的Mapper映射接口上面 @SpringBootApplication: 写在主程序上面 @Configuration: 写在配置类上面 @Bean: 写在配置类中的返回 ...

  5. 【机器学习入门笔记】第 2 课:SVM

    Support Vector machines 为什么人们称一种算法为机器,我也不知道(俄罗斯人发明) 粗略的来说,支持向量机所做的就是去寻找分割线(separating) 或者通常称之为超平面,介于 ...

  6. 【深度学习笔记】第 2 课:Logistic 多项式回归法

    """Softmax.""" scores = [3.0, 1.0, 0.2] import numpy as np def softmax ...

  7. 【神经网络与深度学习】Leveldb的一些具体操作说明

    本文转自 http://blog.csdn.net/poweruser5956/article/details/7727325 Leveldb概述 leveldb提供了持久的键值对的存储.key和va ...

  8. 使用new关键字创建对象数组(C#,C++,Java)

    今天遇到一个题目 分析下面的代码,判断代码是否有误. using System; namespace Test1 { class Point { public int x; public int y; ...

  9. AES ------ 第三方库

    tiny-AES-c-master.zip 这个库可用

  10. Java基础(四)

    概述 常用快捷键 数组 概述 数组是一种引用类型.变量只可以存放一个数据,数组则可以存放多个类型统一的数据,可以存放基本类型,也可以存放引用类型. 如果需要存储的数据很多,那么定义多个变量很麻烦: I ...