
普通dp
Bahuia
软件工程博士
展开
-
CF - 712D 差值dp + 前缀和优化
题意:A和B玩游戏,游戏一共分为t局,两个人各有一个初始分数a和b,每一局,两个人需要在[-k,+k]这个区间中任意选择一个整数,并且加到自己的分数中去,问游戏结束后,有多少种情况,A的分数可以严格大于B?(只要任意一局有至少一个人选择的分数不同两种,就算作不同情况)思路:dp进行计数,看到这种差值不是很大的关系,可以考虑dp的其中一维设置成两人分数的差值 设dp[i][j]表示到第i局为止,a-原创 2016-11-03 23:17:40 · 572 阅读 · 0 评论 -
HDU - 5791 dp
题意:题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5791 求两个序列有多少对公共子序列。思路:dp[I][j]表示序列a第I个之前以及序列b第j个之前的有多少对公共子序列。状态转移的时候要减去重复的。代码:#include <bits/stdc++.h>using namespace std;typedef long long L原创 2017-04-24 21:17:13 · 332 阅读 · 0 评论 -
EOJ-3261 字典树 + dp
题意:题目链接:http://acm.ecnu.edu.cn/problem/3261/ 给出一个词典,包括每个单词的频率,根据公式计算出单词的价值。现在给出一串字符串,要求将字符串分成若干单词,使得分割之后单词价值之后最大,并输出分割结果。思路:词典用字典树维护,对于每个字符串进行O(n^2)的dp,dp[j]=dp[i]+val[u],然后路径标记,输出结果即可。代码:#include <bi原创 2017-05-18 16:35:47 · 398 阅读 · 0 评论 -
HDU 6030 DP + 矩阵快速幂
题意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6030 有红蓝两种颜色的珠子构成一个串(不是环),需要满足在任意长度为素数的区间内,红色珠子数目都要不小于蓝色珠子数目,问长度为n的情况下一共有多少种可能组成的项链。思路:递推。dp[i][0]表示长度为i且末尾为蓝色珠子的方案数,dp[i][1]表示长度为i且末尾为红色珠子的方案数,可以得到转移原创 2017-07-16 16:28:49 · 337 阅读 · 0 评论 -
FZU 2253 DP(最大子段和变形)
题意:题目链接:http://acm.fzu.edu.cn/problem.php?pid=2253 给出一串01序列,现在要选择一个区间[L,R]翻转,求得反转之后的序列包含的1最多有多少个。思路:最大子段和的变形。 设dp[i]表示以位置i为反转终点最多有1的个数,那么一共只有两种可能,要么从之前的最大值转移过来,要么从i点开始翻转,并加上i-1之前的前缀和,因此可以得出方程: dp[i]原创 2017-07-21 09:42:05 · 5217 阅读 · 0 评论 -
Codeforces Round #426(Div.2)D题 DP+线段树
题意:题目链接:http://codeforces.com/contest/834/problem/D 给出n个数,分割成k个区间,每个区间的价值为该区间内不同数字的种类数,问分割之后,所有区间最大价值和是多少。思路:很容易得到方程: dp[i][j]=max(dp[i-1][k]+kind(k+1,j) 其中dp[i][j]表示的是到第j个数为止已经分了i组的最大价值,k的变化范围是[i,j原创 2017-07-31 11:10:15 · 346 阅读 · 0 评论 -
HDU 2049 错排问题dp
题意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2049 中文题。思路:错排dp的经典题。 设dp[i][j]表示1~i个人中有j个人找错了自己的新娘,那么考虑第i个人,有三种可能性:他找对了自己的新娘,那么应该从dp[i-1][j]转移过来他找错了自己的新娘,而且是和之前找错的人互换新娘,此时两个都错,不过与他交换的那个人之前已经错了,所原创 2017-07-24 10:30:19 · 499 阅读 · 0 评论 -
Codeforces 340E 错排问题dp
题意:给出一串长度为n的序列a,将1~n填入序列中-1的位置,使得整个序列是一个1~n的排列,而且保证a[i]!=i,问一共有多少种构造方案。思路:错排问题,这里有了限制条件,有些位置已经被数字填过。 这里将数字分成不同的类型:已经被用过的数不用考虑没有被用过的数,但自己的位置已经被占用,这种数为无限制数,因为可以填在任意-1的位置,这样的数有cnt2个没有被用过的数,而且自己的位置没有被占原创 2017-07-24 10:52:52 · 611 阅读 · 0 评论 -
FZU 2282 错排问题dp
题意:题目链接:http://acm.fzu.edu.cn/problem.php?pid=2282 求1~n的全排列a中,a[i]==i的位置数目>=k的方案数有多少。思路:基础错排dp,与HDU 2049几乎完全一样,多了一个前缀和的操作。代码:#include <cstdio>using namespace std;typedef long long LL;const int MAXN原创 2017-07-24 16:33:15 · 557 阅读 · 0 评论 -
HDU 4758 AC自动机+状压dp
题意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4758 一个矩形从左上角走到右下角,向右移动用R表示,向下移动用D表示,要求满足移动序列中含有给出的两个规定子串,问一共有多少种方案?思路:还是经典的AC自动机+状压DP思路,类似HDU-2825:http://blog.youkuaiyun.com/bahuia/article/details/771490原创 2017-09-07 17:17:12 · 499 阅读 · 0 评论 -
HDU 2457 AC自动机+dp
题意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2457 给出只包含AGCT四个字符的基因序列,其中给出n个字符串,要求序列中不含有这些子串,问最少改变多少个字符?思路:AC自动机+dp,不能存在的子串构成一个AC自动机,然后在自动机上dp,dp[x][y]表示第x个字符已经到了自动机结点y之后能修改的最少步骤。判断字符是否需要修改,然后转移即可原创 2017-09-07 11:19:58 · 345 阅读 · 0 评论 -
HDU 4057 AC自动机+状压dp
题意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4057 要求构造一条长度为l的字符串,构造的字符串中若含有给出的子串,就可以加上该子串的权值,但是同一子串只能算一次权值,问构造的字符串最大权值多少。思路:看到n只有10,典型的AC自动机状压的思路,dp[x][y][S]保存构造到第x个字符,到达结点y,且含有子串的状态为S是否可能,直接转移最后原创 2017-09-07 11:26:10 · 356 阅读 · 0 评论 -
hihocoder 1580 枚举+dp+RMQ
题意:题目链接:http://hihocoder.com/problemset/problem/1580?sid=1195305 给出一个矩阵,让你将其中一个数的值变成p(必须修改一个,且仅能修改一个),然后求最大子矩阵和。思路:2017北京网络赛C题,这题最后没A真是好气啊。 一开始被带偏榜,花了太多时间在D上,结果一直wa,后来C题过得多了再来看C题,秒出思路,然后一直WA到结束。 只不过原创 2017-09-24 10:58:18 · 711 阅读 · 0 评论 -
EOJ 3329 dp
题意:题目链接:http://acm.ecnu.edu.cn/problem/3329/ 中文题。但是题意有点迷,在计算子集个数时,对于同一个子集只计算一次,如{1,2,3,3}中存在两个{1,2,3},但是计算的时候只算一个{1,2,3}。思路:dp,需要点优化,因为这里数的范围只有3500~4500,所以可以存这些数字的个数,注意到这里异或产生的质数最多只到8191。 dp[i][j]表示到原创 2017-09-15 20:29:01 · 448 阅读 · 0 评论 -
HDU 6199 dp
题意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6199 AB两个人玩游戏,n个数,从左到右依次选取。第一个人可以选择1个或者2个数,假设某一轮一个人选择了k个数,那么下一轮另一个人就要选择k个或者k+1个数,如果剩下的数字不够就不能选择,游戏终止。此时比较A-B的大小,问两个人都采取最优策略,都尽可能让自己所获得的数的总和大,最后A-B的最大值原创 2017-09-15 21:18:37 · 412 阅读 · 0 评论 -
HDU 6155 dp+矩阵+线段树
题意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6155 给出一个长度为n的01序列以及Q个操作,操作分两类,一种是将[L,R]内的01序列翻转,二是求出[L,R]中包含多少不同的子序列。思路:对于01序列,设dp[i][j]表示到前i个字符为止,末尾字符为j的子序列个种类数,可以很容易得到状态转移方程: 当str[i]==’0’时: dp[原创 2017-08-30 20:23:17 · 478 阅读 · 0 评论 -
Gym 101490K dp
题意:题目链接:https://vjudge.net/problem/Gym-101490K 一个环上有L个点,每个两个相邻的点相距1个单位,现在要在这些点上插旗子,要求长度为S的区间内至少要有一个旗子,问方案数。思路:dp[x]表示长度为x的区间,首尾位置都插旗的合法方案数。 很显然dp[i]=dp[i-1]+dp[i-2]+…+dp[i-s]; 至于环如何处理,首先取一个任意的起点,然后枚原创 2017-10-08 16:17:29 · 524 阅读 · 0 评论 -
HDU 4511 AC自动机+DP
题意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4511 中文题。思路:常见的思路,不过要注意x和y要用double,否则溢出。代码:#include <bits/stdc++.h>using namespace std;const double INF = 1e20;const int MAXN = 505;const int K =原创 2017-09-22 17:29:24 · 589 阅读 · 0 评论 -
HDU - 5763 KMP + DP
题意:给出两个字符串s和t,其中t有两种意义,s中可能包含若干t,问s一共有多少种意义思路:KMP预处理出匹配位置,然后dp代码:#include using namespace std;typedef long long ll;const int MAXN = 111111;const ll MOD = 1000000007;int Next[MAXN];boo原创 2017-03-24 10:29:55 · 457 阅读 · 0 评论 -
UVALIVE 7505 dp
题意:题目链接:https://vjudge.net/problem/UVALive-7505 2015年EC-final的F题 这题是半年前做的,当时想了非常久,最近又拿出来回味一下。 N只蚂蚁在一个水平放置的长度为N+1的杆子上,其中第i只蚂蚁就在据左端点i的位置上,而且重量也为i,每只蚂蚁会随机等概率地选择移动方向,向左或者向右,移动过程中到达杆子的端点就会折返。蚂蚁的移动速度都是...原创 2016-11-05 20:53:02 · 1055 阅读 · 2 评论 -
HDU 5550 dp + 前缀和优化
题意:有个大楼有n层,每层都有两种人,一种喜欢的打球,一种喜欢游泳,现在要你在每一层要么开设球馆,要么开设游泳馆,分配完毕以后,打球的要到球馆,游泳的要到游泳馆,问最优分配下,所有人要移动的最短距离和是多少?思路:dp[i][0/1]表示第i层布置为0或1,且i+1层为1或0(与第i层相反)的最小代价。 dp[i][0]可以由dp[j][1]转移过来,其中j小于i,那么我们考虑j+1到i的这些层要原创 2016-11-06 00:14:41 · 612 阅读 · 0 评论 -
CF - 269B LIS
题意:给出n个盆栽摆在坐标x轴上,每个盆栽有自己的种类和放置的坐标,求出最小移动几个盆栽,可以使盆栽的种类序列非递减。思路:其实想找到最少移动的数目,就是要知道最多有多少个不需要移动,那么直接求一遍裸的LIS即可,这里是最长非递减序列。代码:#include using namespace std;const int MAXN = 5e3 + 10;int a[MAX原创 2016-11-08 23:19:15 · 458 阅读 · 0 评论 -
CF - 463D LIS + 思维
题意:题意很简单,给出m个1到n的排列,求出m个序列的最长公共子序列。思路:刚看这道题很容易以为是求LCS,但是并没有进展。其实这里,需要用另外一种方式表示两个排列相等。两个排列相等,当且仅当对于任意一个排列中的数x,y,如果在第一个排列中pos[x]有了上面的思路,我们只要在第一个排列中找到一个最长的子序列,满足子序列中的任意两个元素在m个排列中的相对位置都相等。这样就可以通过预原创 2016-11-08 23:31:47 · 368 阅读 · 0 评论 -
CF - 294B DP
题意:题意看图就懂,求书能摆放的最小长度,上面书的长度不能超过下面的。思路:每本书有两种可能的摆放,由这两种转移即可。代码:#include using namespace std;const int MAXN = 105;const int INF = 0x3f3f3f3f;int t[MAXN], w[MAXN], dp[MAXN][2 * MA原创 2016-11-09 09:35:13 · 374 阅读 · 0 评论 -
CF - 505C DP
题意:有30000个岛屿,某些岛屿上会有宝藏,现在要从岛0开始移动,每次只能往序号更大的岛移动,如果第i-1次移动的距离为l,那么第i次的移动只能有三种情况,l-1、l、l+1(必须要满足都>1),第一次移动的距离为d,问最多能够获得多少宝藏。思路:要注意到1+2+...+250>30000,可以发现每次走一步的距离与第一步之间的差距不会超过250,所以我们可以考虑dp[i][原创 2016-11-09 09:43:29 · 471 阅读 · 0 评论 -
CF - 375B DP
题意:给出一个n*m的01矩阵,求出最大的全1子矩阵的面积,可以任意改变行的顺序。思路:枚举每一列,按照以这一列为末尾的连续1的个数排序,再枚举子矩阵的右下角。代码:#include using namespace std;const int MAXN = 5005;char a[MAXN][MAXN];int dp[MAXN][MAXN], tmp原创 2016-11-09 10:04:34 · 411 阅读 · 0 评论 -
CF - 255C DP
题意:找到一串序列b中的一段最长子序列,子序列满足x,y,x,y,x,y...交替的形式。思路:也算一种套路吧,这种类型dp[i][j]设为序列的最后两个数,这样状态转移就很明显了,dp[i][j] = max(dp[i][j], dp[last[j]][i] + 1),其中last[j]是j这个数上一次出现的位置。代码:#include using name原创 2016-11-09 10:16:39 · 570 阅读 · 0 评论 -
51Nod - 1133 dp + 二分 + 维护最大值
题意:X轴上有N条线段,每条线段有1个起点S和终点E。最多能够选出多少条互不重叠的线段。(注:起点或终点重叠,不算重叠)。例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重叠。Input第1行:1个数N,线段的数量(2 <= N <= 10000)第2 - N + 1行:每行2个数,线段的起点和终点(-10^9原创 2016-12-30 16:21:22 · 409 阅读 · 0 评论 -
51Nod - 1043 dp
题意:1个长度为2N的数,如果左边N个数的和 = 右边N个数的和,那么就是一个幸运号码。例如:99、1230、123312是幸运号码。给出一个N,求长度为2N的幸运号码的数量。由于数量很大,输出数量 Mod 10^9 + 7的结果即可。Input输入N(1Output输出幸运号码的数量 Mod 10^9 + 7Inpu原创 2017-01-18 11:01:20 · 341 阅读 · 0 评论 -
51Nod - 1406 dp
题意:有n个整数。输出他之中和x相与之后结果为x的有多少个。x从0到1,000,000Input第一行输入一个整数n。(1<=n<=1,000,000).第二行有n个整数a[0],a[1],a[2],...a[n-1],以空格分开.(0Output对于每一组数据,输出1000001行,第i行对应和i相与结果是i的有多少个数字。Inp原创 2017-02-18 11:08:19 · 962 阅读 · 0 评论 -
51Nod - 1503 多线程dp + 背包思想优化
题意:一只猪走进了一个森林。很凑巧的是,这个森林的形状是长方形的,有n行,m列组成。我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m。处于第r行第c列的格子用(r,c)表示。刚开始的时候猪站在(1,1),他的目标是走到(n,m)。由于猪回家心切,他在(r,c)的时候,只会往(r+1,c)或(r,c+1)走。他不能走出这个森林。这只猪所在的森林是一原创 2017-02-10 09:52:10 · 829 阅读 · 0 评论 -
51Nod - 1270 dp
题意:数组A包含N个元素A1, A2......AN。数组B包含N个元素B1, B2......BN。并且数组A中的每一个元素Ai,都满足1 (公式表示所有两个相邻元素的差的绝对值之和)给出数组B,计算可能的最大代价S。Input第1行:1个数N,表示数组的长度(1 <= N <= 50000)。第2 - N+1行:每行1个数,原创 2017-01-19 22:45:40 · 363 阅读 · 0 评论 -
51Nod - 1407 容斥原理 + dp
题意:有n个整数,问从他们中取出若干个数字相与之后结果是0的有多少组。思路:这道题需要51nod1406作为基础,链接:点击打开链接因为从正面考虑直接求解相与和为0不好做,所以可以利用容斥来解决,因为数的总量就这么大,所以我们在总数中减掉相与和为1的方案数,相与和为2的方案数等等,就可以得到最后的答案,可以用dp求出来对于每一个x都有a[i] & x == x的个数(也就是1406原创 2017-02-19 18:50:09 · 1216 阅读 · 0 评论 -
HDU - 5794 dp + 容斥思想 + Lucas
题意:一个n*m的棋盘,初始时刻一枚棋子在(1,1)位置,每次他只能从(x,y)移动到(x+1,y+2)或者(x+2,y+1)的位置,棋盘上还有一些障碍点,这些点不能到达,问最后旗子能到达(n,m)的方案数。思路:首先画几个例子,观察旗子能到达的点的规律,统计出规律后发现,能到达的点组成了一个杨辉三角,这时候为了方便处理,进行坐标转换,以杨辉三角最左边的一条边和最右边的一条边作为坐标轴原创 2017-02-20 15:23:59 · 364 阅读 · 0 评论 -
51Nod - 1376 dp
题意:数组A包含N个整数(可能包含相同的值)。设S为A的子序列且S中的元素是递增的,则S为A的递增子序列。如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS)。A的LIS可能有很多个。例如A为:{1 3 2 0 4},1 3 4,1 2 4均为A的LIS。给出数组A,求A的LIS有多少个。由于数量很大,输出Mod 1000000007的结果即可。相同的数字在不同的位置原创 2017-02-20 16:57:35 · 573 阅读 · 0 评论 -
51Nod - 1781 dp + 线段树 + 离散化
题意:Pinball的游戏界面由m+2行、n列组成。第一行在顶端。一个球会从第一行的某一列出发,开始垂直下落,界面上有一些漏斗,一共有m个漏斗分别放在第2~m+1行,第i个漏斗的作用是把经过第i+1行且列数在Ai~Bi之间的球,将其移到下一行的第Ci列。 使用第i个漏斗需要支付Di的价钱,你需要保留一些漏斗使得球无论从第一行的哪一列开始放,都只可能到达第m+2行的唯一 一列,求花费原创 2017-02-13 09:28:43 · 469 阅读 · 0 评论 -
51Nod - 1101 背包
题意:N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元。例如:5分钱换为零钱,有以下4种换法:1、5个1分2、1个2分3个1分3、2个2分1个1分4、1个5分(由于结果可能会很大,输出Mod 10^9 + 7的结果)Input输入1个数N,N = 100表示1元钱。(原创 2017-02-03 23:05:42 · 325 阅读 · 0 评论 -
Gym 101201B dp
题意:题目链接:http://codeforces.com/gym/101201/attachments 给出一个迷宫,以及一串上下左右的指令,机器人需要按照指令前进,问最少添加以及删除多少指令可以令机器人顺利从起点走到终点。如果机器人顺着指令遇到障碍或者边界,那么自动忽略这条指令留在原地。思路:好题。 dp[i][x][y]表示在前i个指令完成之后,机器人处于(x,y)的最少增加删除代价。原创 2017-10-13 15:59:09 · 852 阅读 · 0 评论