容易想到可以转化为一个有m堆石子,石子总数不超过n-m的阶梯博弈.阶梯博弈的结论是相当于只考虑奇数层石子的nim游戏. nim和不为0不好算,于是用总方案数减掉nim和为0的方案数.然后考虑dp,按位考虑,设f[i][j]为已确定奇数石子堆的第i位及以上的放法后,保证当前异或和为0,剩下j个石子时的方案数.转移套一些组合数即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib…
点此看题面 大致题意: 有\(n\)个格子,让你摆放\(m\)个金币.二人博弈,每次选择一个金币向左移任意格,无法移动者输.问有多少种方案使先手必胜. 阶梯\(Nim\) 阶梯\(Nim\)的基本模型,就是有\(n\)层楼梯(从\(0\sim n-1\)编号),每层楼梯上有若干石子,每次可以取任一层楼梯上任意多个石子到下一层,无法移动者输. 它的解决方法就是,去掉所有编号为偶数的楼梯,然后对剩下的这些编号为奇数的楼梯当成普通\(Nim\)来做. 原理是,如果一人移动编号为偶数的楼梯上的石子到下一…
[SDOI移动金币 链接 vijos 思路 阶梯博弈,dp统计. 参见wxyww 代码 #include <bits/stdc++.h> using namespace std; const int N = 2e5 + 7, mod = 1e9 + 9; int read() { int x = 0, f = 1; char s = getchar(); for (;s > '9' || s < '0'; s = getchar()) if (s == '-') f = -1; f…
话说这题放在智推里好久了的说,再不写掉对不起自己233 首先你要知道一个叫做阶梯Nim的东西,具体的可以看这篇博客 那么我们发现这和这道题的关系就很明显了,我们把两个金币之间的距离看作阶梯Nim的每一堆的石子个数 考虑阶梯Nim的结论:奇数编号堆的石子异或和为\(0\),发现我们可以搞一个很暴力的DP出来 \(f_{i,j,k}\)表示当前放了前\(i\)堆石子,总共用了石子个数是\(j\),其中奇数堆石子的异或和为\(k\)的方案数,转移的时候直接枚举当前堆拿了几个即可,复杂度\(O(n^3\…
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game called Xoinc for them. Initially a stack of N (5 <= N <= 2,000) coins sits on the ground; coin i from the top has integer value C_i (1 <= C_i <=…
由nim游戏的结论,显然等价于去掉一些数使剩下的数异或和为0. 暴力的dp比较显然,设f[i][j][k]为前i堆移走j堆(模意义下)后异或和为k的方案数.注意到总石子数量不超过1e7,按ai从小到大排序,这样k的枚举范围就不会超过2ai,于是复杂度O(md). 注意空间卡的非常紧,连滚动都开不下,改为留下的有j堆(模意义下)可能比较方便,存一下j=d-1时的数组,对j=1~d-1倒序转移完后再特判j=0即可. #include<iostream> #include<cstdio>…
分析 阶梯NIM模型:共有m+1堆石子,石子总数不超过n-m,求必胜的,即奇数堆石子数目异或和非零的局面数.补集转化,答案C(n,m)-奇数堆石子数目异或和位0的局面数. 可以想到按位dp,设f[i,j]表示已经考虑了前i位(异或和0),石子和为j的方案数:转移时考虑下一位出现的被统计1的个数k,k为偶数,带系数C((m+1)/2,k),即m+1/2个奇数堆中出现k个1的方案. 最后将没有分配的n-m-i个石子放入m/2个偶数堆中,可以一个都不放. 实现 #include <bits/stdc+…
原文链接www.cnblogs.com/zhouzhendong/AGC026F.html 前言 太久没有发博客了,前来水一发. 题解 不妨设先手是 A,后手是 B.定义 \(i\) 为奇数时,\(a_i\) 为"奇数位上的数":\(i\) 为偶数时, \(a_i\) 为"偶数位上的数".定义左.右两端的数分别表示 \(a_1\) 和 \(a_n\). 考虑第一步: 首先,如果 A 取了左右某一个端点,那么他必然能取走和他取的点奇偶性相同的所有点. 然后,我们考虑…
分析 显然可以转化为阶梯nim. 于是问题转化为了对于所有\(i \in [0,n-m]\),求长度为\(\lfloor\frac{m+1}{2}\rfloor\),和为\(i\),异或和非\(0\)的非负整数序列的个数. 直接DP看似不太可行,然而UOJ群的dalao们告诉博主可以按位DP. 令\(f[i][j][0/1]\)表示考虑了后\(i\)位,当前的和为\(j\),后\(i\)位的异或和是否为\(0\)的方案数,转移时枚举当前位有多少个\(1\),类似数位DP那样就好. 最后用隔板法统…
首先可以把问题转化一下:m堆石子,一共石子数不超过(n-m)颗,每次可以将一堆中一些石子推向前一堆,无法操作则失败,问有多少种方法使得先手必胜? 然后这个显然是个阶梯Nim,然后有这样的结论:奇数层异或和为0.具体证明:参考这篇博客,当然不是我写的.如果不知道结论,里面有例题POJ1704可以做一下. 然后直接DP显然会T飞,考虑一个按位DP的技巧,f[i][j]表示确定前i位异或起来为0,剩下j个棋子的方案数.组合数相乘转移,注意一些细节即可.复杂度O(nmlogn) #include<bit…
A. Gudako and Ritsuka 链接 by Yuki & Asm.Def 期望难度:Hard- 考虑从后往前进行博弈动态规划,在这一过程中维护所有的先手必胜区间.区间不妨采用左开右闭,方便转移. 考虑一次转移,如果当前Servant的后一个位置属于对手,则当前Servant的必胜区间可以通过将后一个Servant的每个必败区间的左端点+1.右端点+x得到:如果后一个位置属于自己,则可以通过将后一个Servant的必胜区间做同样的操作得到.不妨分别对必胜区间左右端点维护一个偏移量,需要…
/* ///题解写的很认真,如果您觉得还行的话可以顶一下或者评论一下吗? 思路: 这题复杂在要取前k大的结果,如果只是取最大情况下的金币和,直接 动态规划递归就可以,可是前k大并不能找出什么公式,所以在二元数组的基础上再并上一个vector 首先:初始化最左边和最上边(动态规划的边缘) 其次:找出关系,每个格的金币只可能来自上边或者右边(动态规划的状态方程) 然后:我们要找的是前k大金币总和而不是前1大,所以准备vector存更多情况 然后:每次处理时,当前格子除了拿上自己的金币外,还要接受前面…
Leetcode之动态规划(DP)专题-1025. 除数博弈(Divisor Game) 爱丽丝和鲍勃一起玩游戏,他们轮流行动.爱丽丝先手开局. 最初,黑板上有一个数字 N .在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < N 且 N % x == 0 . 用 N - x 替换黑板上的数字 N . 如果玩家无法执行这些操作,就会输掉游戏. 只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false.假设两个玩家都以最佳状态参与游戏. 示例 1: 输入:2…
正题 题目链接:https://www.luogu.com.cn/problem/P5363 题目大意 \(1\times n\)的网格上有\(m\)个硬币,两个人轮流向前移动一个硬币但是不能超过前一个硬币,无法移动者输. 求有多少种情况先手必胜. 解题思路 竟然有我会的题,我感动 位置做差分再减去\(1\)之后就是一个经典的阶梯博弈问题了,结论就是奇数位置的异或和. 但是这题是计数,先让\(n\)减去\(m\),然后正难则反考虑求总方案和后手必胜的情况,这样问题就变为有多少个长度为\(m\)的…
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1832 题意 n个数据,A,B两个玩家轮流从两端取1到多个数字,最终数字加和为分数,分数最大的获胜,A为先手,二者都很聪明,求A分数-B分数. 思路 如刘书, 区间DP,明显可以用a[i][j]记录区间[i,j)的先手最大分数. 感想 1. 要像刘一样,在能达到要求之后进一步思考如何减…
聪明的kk 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 聪明的"KK" 非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国不断变换和绚丽多彩的自然风光与城市风貌.展馆由五部分组成,馆内影院播放名为<一眨眼的瞬间>的宽银幕短片,反映了建国以来人民生活水平和城市居住环境的惊人巨变. 可移动"沙丘"变戏法 的灵感源于其独特而雄伟的自然景观--富于传奇色彩的险峻沙丘.宏伟的结构.可循环的建材,与大自然相得益…
题目 给定一个整型数组arr,代表数值不同的纸牌排成一条线.玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明.请返回最后获胜者的分数. 例子 arr=[1,2,100,4]. 开始时玩家A只能拿走1或4.如果玩家A拿走1,则排列变为[2,100,4],接下来玩家B可以拿走2或4,然后继续轮到玩家A.如果开始时玩家A拿走4,则排列变为[1,2,100],接下来玩家B可以拿走1或100,然后继续轮到玩家A.玩家A作为绝顶聪…
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975,…
[1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈), 1742, 1887,1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975, 1989, 2018, 2029,…
/********************* Problem Description 是一仅仅喜欢探险的熊.一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能走一格,且仅仅能向上向下向右走曾经没有走过的格子,每个格子中都有一些金币(或正或负,有可能遇到强盗拦路抢劫,度度熊身上金币能够为负,须要给强盗写欠条),度度熊刚開始时身上金币数为0.问度度熊走出迷宫时候身上最多有多少金币? Input 输入的第一行是一个整数T…
]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈), 1742, 1887, 1926(马尔科夫矩阵,求平 衡), 1936,1952, 1953, 1958, 1959, 1962, 1975, 1989, 2018, 2029,2…
此文转载别人,希望自己可以做完这些题目. 1.POJ动态规划题目列表 easy:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975…
  A OpenJ_Bailian 1088 滑雪     B OpenJ_Bailian 1579 Function Run Fun     C HDU 1078 FatMouse and Cheese     D POJ 3280 Cheapest Palindrome     E OpenJ_Bailian 1976 A Mini Locomotive     F OpenJ_Bailian 2111 Millenium Leapcow     G OpenJ_Bailian 1141 B…
主要讲第五课的内容前缀树应用和第六课内容暴力递归改动态规划的最全步骤 第一题 给定一个数组,求子数组的最大异或和. 一个数组的异或和为,数组中所有的数异或起来的结果. 简单的前缀树应用 暴力方法: 先计算必须以i结尾的子数组的异或和,然后再计算机i+1的,以此类推... 最暴力的解 public static int getMaxEor1(int[] nums) { int maxEor = Integer.MAX_VALUE; for (int i = 0; i < nums.length;…
[题目]H. Ember and Storm's Tree Game [题意]Zsnuoの博客 [算法]动态规划+排列组合 [题解]题目本身其实并不难,但是大量干扰因素让题目显得很神秘. 参考:Zsnuoの博客 一.首先Ember必胜(考虑n个点连成一条链),故合法的树一定满足先手必胜.当Storm选择的链满足单调或单峰时,每一条链对答案贡献两对(i,op). 解释:单调时,考虑翻转最后一个数和从第二个数开始取负两种操作.单峰时,上凸考虑翻转顶峰和顶峰右侧的数,下凸考虑取负顶峰和顶峰右侧的数.…
一个监狱里有P个并排着的牢房,从左往右一次编号为1,2,-,P.最初所有牢房里面都住着一个囚犯.现在要释放一些囚犯.如果释放某个牢房里的囚犯,必须要贿赂两边所有的囚犯一个金币,直到监狱的两端或者空牢房为止.现在要释放a1,a2,...,aQ号囚犯,如何选择释放的顺序,使得使用的金币最少. 思路: 其中很重要的一点:释放了某个囚犯以后,就把连续的牢房分成了没有任何关系的两段. 只要枚举出所有的释放囚犯的顺序即可,复杂度为 O(Q3). 利用动态规划枚举所有的情况的时候,我们有2种方法: 方法1.(…
划分型动态规划: 513. Perfect Squares https://www.lintcode.com/problem/perfect-squares/description?_from=ladder&&fromId=16 public class Solution { /** * @param n: a positive integer * @return: An integer */ public int numSquares(int n) { // write your cod…
写在前面的话 知识基础:一些基础的博弈论的方法,动态规划的一些知识 前言:博弈论就是一些关于策略或者游戏之间的最优解,动态规划就是对于一些状态之间转移的一些递推式(or 递归),dp分为很多很多种,比如状压dp我感觉其实就是一种暴力,数位dp也可以用记忆化搜索的形式解决.可见动态规划其实是解决一些不能快速解决,不能以O(1)方法解决的问题,而博弈之中,经常会出现一些O(1)方法解决的策略,或者O(n),可见博弈dp它有其不确定性(或者说有不能直接解决的方案)所以需要在博弈的基础上加上dp.举一个…
一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影响) @4.买主件和附件2 @5.买主件和两个附件 2.因为要求的是重要度*价格,那么数组就直接存重要度*价格,最后输出f[n]就是答案 附件不一定刚好有两个,可是如果没有的话数组的值是空的,也就好像虚无缥缈的灵魂一样,用了也没关系 3.主件和附件要构建一层联系,一个个输入物品时肯定混杂着主件和附件…
366. 斐波纳契数列 中文 English 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ... 样例 样例 1: 输入: 1 输出: 0 样例解释: 返回斐波那契的第一个数字,是0. 样例 2: 输入: 2 输出: 1 样例解释: 返回斐波那契的第二个数字是1. class Solution: "&qu…