动态规划
文章平均质量分 59
johsnows
正在静下心来学算法的acmer
展开
-
LeetCode 887. 鸡蛋掉落
这道题记得以前在gym上训练欧洲区域赛做过,但是现在完全忘了.很自然的想法就是用动态规划去求解.首先想到的是定义dp[i][j]为i层楼,j个鸡蛋最少xu'yao原创 2021-06-10 19:48:21 · 105 阅读 · 0 评论 -
cf1101 D GCD Counting (树dp)
挺简单的树dp,两个点之间的公共素因子不会超过7个,枚举和子节点之间的公共素因子情况,有公共素因子就可以转移,长谷ide树dp去做就行了。代码:#include <bits/stdc++.h>#define ps push_backusing namespace std;const int maxn=2e5+5;int a[maxn], ans;int d[maxn][8];int cnt[maxn];int dp[3][8][maxn];int s[30], m.原创 2020-07-31 10:46:21 · 173 阅读 · 0 评论 -
2020kickstart d Beauty of tree
题意:a,b两个人, 分别在一棵节点数为n的有根树上,随机选择一个点,每x(y)个点(往根的方向)对一个节点染色,直到到达或超过根节点。问这棵树被染色的点的期望值。解题思路:首先有N*N个情况,每种情况下这棵树被染色的数目之和除以N*N就是要求的期望值所以问题就算如何统计每种情况染色数目之和暴力枚举每种情况肯定是不行的,可以换一个思路来想,去求每个点被选取后会染色多少个点。在一棵树上,假设p-x就是p下一步会染的点,那么r[p]=r[p-x]+1,只需要一遍dfs指定向下遍历就.原创 2020-07-16 18:48:54 · 204 阅读 · 0 评论 -
atcoder abc 164 Multiple of 2019(dp)
dp题,状态dp[i][j],表示以第i字符结尾的数字中对2019取模为j的数字有多少个#include <bits/stdc++.h>using namespace std;const int maxn=2e5+5;int dp[3][3000];char str[maxn];int main(){ scanf("%s", str); int i,...原创 2020-04-26 22:35:48 · 513 阅读 · 0 评论 -
kickstart 2019H Elevanagram
↵太菜了只补了小数据的做法小数据范围下可以直接把每个数字从小到大报存下来,记为a[i].dp[i][j][k]表示前i个数,取j个数为正,i-j个数为负的时候,加和对11取模为k是否可以完成。状态表示出来转移就很简单了,对于第i个数,枚举a[i]为正、负的情况就ok:dp[i][j][(k+a[i])%11]=max(dp[i-1][j-1][k], dp[i][j][(k...原创 2019-11-22 18:30:55 · 368 阅读 · 0 评论 -
Math Magic hdu 4427 (dp)
题意:一个长度为k的数量sum为n,lcm为m,问这样的数列能构造出多少个,结果对1e9+7取模。解题思路:计数问题,一般就是dp了。首先想到的是,一个数列的lcm已知,那么数列 里所有的数应该都要是lcm的因子,不可能出现其它数,这一点想到,dp状态其实也不难想了。dp[i][j][k]表示长度为i的数列和为jlcm为k的方案数。转移就是dp[i+1][j原创 2017-07-22 10:21:57 · 294 阅读 · 0 评论 -
POJ 1661 Help Jimmy
其实这道题感觉就是数字三角形问题翻版。设子问题为从当前这块板子走到地面需要的时间。每块板子只有左右两个方向走,所以对于以每块板子为起点的子问题有两个转移方向。每个方向能到哪个板子或是不能往下跳都是可以确定的,这个可以预处理一下。然后从高度最低的板子一次往上更新,就求出每个子问题了。最后算一下从起始点往下跳到的第一个板子是哪块就解决了。别忘了直接跳原创 2017-07-18 17:04:42 · 218 阅读 · 0 评论 -
POJ 1015 Jury Compromise (dp)
题意:有n件物品,每件物品有a价值,b价值,从其中选m件物品,使其总a价值-总b价值的绝对值最小,相等的情况下,总a价值+总b价值最大。解题思路:背包既视感,网上很多题解的做法是有问题的,而且那种知道会重复,然后再判断下去掉重复的做法确实很变扭,最后的避免重复的做法就是像01背包一样逆向转移。设dp[i][j]表示选取i件物品,价值差为j时,价值和的最大值,如果为-原创 2017-07-17 22:11:35 · 354 阅读 · 0 评论 -
codeforces 831 D Office Keys(dp)
题意:n个人要去一个地方p,给出每个人的一维坐标a[i],去这个地方需要一把钥匙,总共有k把钥匙,给出每把钥匙的坐标b[i],问n个人最后都到达了这个地方需要多少经过多少时间,每个人走一个单位距离需要一个单位时间。解题思路:看起来很复杂的题,有目的地坐标还有钥匙坐标,其实仔细想想,取到钥匙后,接下来还需要的时间也随之确定下来了,所以只需要考虑人和钥匙的关系即可。可以原创 2017-07-14 16:36:01 · 799 阅读 · 0 评论 -
hdu 1074 Doing Homework (状压dp)
题意:小明有n个作业,没个作业有ddl,有完成需要的时间t,一个作业如果超过ddl一个时间,就扣去一分,问最后做完所有作业扣去的分数最少是多少,并输出做作业的顺序。解题思路:基础dp题,以为应该很easy,xjb贪了3发,发现不对。其实很容易想到作业,只不过觉得有点麻烦。但是想到去写状压了,也就简单了。用一个1dp[i][j],i表示第几天,j就是上面的二进制数原创 2017-07-11 17:34:09 · 307 阅读 · 0 评论 -
srm 711 DerangementsDiv2(dp)
题意:1-n+m的数排列,要求前m个数p[i]!=i,问有多少种排列方式,对1e9+7取模解题思路:不会做,最后问的p神才会了。dp状态是dp[i][j],表示i个数排列要求前j个数 错排的方案数。转移dp[i][j]=(i-j)*d[i-1][j]+j*dp[i-1][j-1];分别表示最后一个数放在后n个位置还是前m个位置的两种方法。i=j的原创 2017-07-02 09:31:14 · 284 阅读 · 0 评论 -
hdu 1024 Max Sum Plus Plus(dp)
题意:求m段连续子序列和。解题思路:首先想到二维的dp状态dp[i][j]表示前i个数j段得到的最大值。转移有两种情况,首先是不增加新的组,加在前面一组上,转移就是dp[i][j]=max(dp[i][j], dp[i-1][j]+a[i]);第二种是增加新的一组,这里需要注意,不增加新的一组的时候由于是连续的一定和i-1相连,而增加新的一组就不需要了,中间可以很多原创 2017-07-27 08:11:12 · 241 阅读 · 0 评论 -
洛谷 排列LCS P1439 (LCS)
看到黑书上写着,LCS是稀疏匹配,只需要关注能让答案更新的地方就可以了。也就是当a[i]==b[j],dp[i+1][j+1]=dp[i][j]+1.这种情况。所以对于每一个i,我们只需要关心,和a[i]相等的值再b种的位置j,记为pair[i]。所以i从0开始更新,去找出pair[j]小于pair[i]的最大的dp[j],这个过程用个线段树或者树状数组优化就好原创 2017-07-27 09:38:21 · 411 阅读 · 0 评论 -
Gym - 101334E Exploring Pyramids(dp+分治)
题意:给出一个多叉树先序遍历序列,问有多少种不同的树的结构能跑出这样的序列,答案对1e9取模。解题思路:可以考虑一颗树在什么位置进行了怎样的分叉决定了它的情况,所以我们在不同的位置枚举不同的分叉, 统计情况就可以了。对于一个没有分叉的一条到叶子节点的链,它的先序遍历一定是一个回文串。所以一条链能产生一个分叉关键条件是否由两个及以上不重叠子串组成。这个过程可以递归分治得到。原创 2017-08-28 10:03:30 · 319 阅读 · 0 评论 -
codeforces 449 D Jzzhu and Numbers(容斥+dp)
这题真的爆炸难懂...待补。代码:#include using namespace std;const int mod=1e9+7;const int maxn=1e6+5;int dp[maxn];long long p[maxn];int main(){ int n, i, j, x; cin>>n; for(i=1, p[0]=1; i<原创 2017-08-23 20:29:12 · 343 阅读 · 0 评论 -
hdu 5450 Traversal(状压dp)
题意比较迷,第一句话的意思是那k个数不存在不用管,出题人的英语.....但是这个题还是比较难的。每个点只能到差值1, p, p+2的点,要求每次走数量大于等于3的环,不能重复走完所有点。走完所有点形成环其实相当于,每个点出度入度两次,要超过3个点意味着不能两两成环,更不能自环。由于最多只能到达p+2之外的点,所以每个点一定要在p+2的距离只能形成一个环。可以维护原创 2017-08-23 21:24:21 · 464 阅读 · 0 评论 -
uva 10934 Dropping water balloons(dp)
题意:给出k个水球,n层楼,现在想测试出水球最低会在那层楼扔下爆炸,问最少需要测试多少次, 注意要求的情况是每层楼都可能爆炸。解题思路:一眼看上去会觉得是二分,如果求数够的话,确实能够在log2(n)的次数之内求出测试出来,但是这个问题我们要考虑的是每个位置都有可能爆炸,所以不仅球不够,目标位置没有确定也导致我们不可能考虑二分。想一想如果去搜索的话,我们肯定会搜索还原创 2017-08-30 16:18:40 · 339 阅读 · 0 评论 -
atcoder Yet Another Palindrome Partitioning(dp)
题意:给出一个字符串,最少需要多少次拆分得到的子串都是合法的,合法的定义是改变字符串顺序能得到一个回文串。解题思路:容易想到的是一个合法的字符串的26个字母最多只能一个字母出现次数为奇数,用26位二进制数(mask)表示,1表示奇数的话,只有能整除2的和0是合法的。dp想法是每个状态减去一个合法串然后转移过来,但是显然不能for一下,这时候就利用下上面的mask。用ma原创 2017-10-23 19:21:10 · 435 阅读 · 0 评论 -
hdu 6348 序列计数(dp+bit)
像2015ccpc的一道题..赛时直接贴代码上去,果断mle到死,因为数据范围加到了1e4,所以没法开出这么大的二维数组。一个优化思路就是,当长度大于序列的最长上升子序列时,上升序列的数量一定是0,所以dp[i][j],定义长度为前i个数里面长度为j的上升序列个数,j这一维只需要开到最长上升子序列的个数,用vector动态开就行,超过最长上升子序列长度的直接输出0,。然后这题序列是随机的,根据结论...原创 2018-08-11 11:36:49 · 247 阅读 · 0 评论 -
comet oj 2760 符文能量(dp)
计算两两之间的和的序列,就是和最小连续子串和类似的dp了注意区间内的值是*k平方不要被-1迷惑注意将单个值*k的操作需要单独枚举注意long long代码:#include <bits/stdc++.h>using namespace std;const int maxn=1e5+5;long long a[maxn];long long b[m...原创 2019-08-10 10:03:41 · 110 阅读 · 0 评论 -
hdu 2196 Computer(树dp)
题意:给出n个点, n-条边,每条边有权值,问从每个点出发能得到的最大值,不返回。解题思路:第一道树dp。树dp的话只不过是转移的关系是在当前节点和几个孩子节点上,也就是从孩子节点转移到当前节点,但由于是一棵树,当前节点的父节点其实也是自己的一个前驱,也可以从父亲节点转移到当前节点,树dp比较麻烦的就是这一步了。这道题,一个节点出发的最大值的路径无非就是过父亲节原创 2017-06-20 11:23:57 · 452 阅读 · 0 评论 -
第七届山东省赛 Feed the monkey(dp)
题意:给出a,b,c三种物品,每种物品有A,B,C件,将所有的物品排成一列,每种物品不能连续出现aa,bb,cc次,问有多少种排列方式。解题思路:很明显的dp,但是转移不好想。首先我们需要思维i,j,k,l分别表示当前用了i件a,j件b,k件c,序列末尾是第l种物品,dp[i][j][k][l]就表示这个状态有多少种排列方式。l是不可少的,只用三维的话怎么也做不对。原创 2017-06-03 19:28:01 · 392 阅读 · 0 评论 -
UVALive 6592 C - Cent Savings (dp)
题意:小明买了n件商品,付钱的时候他可以划分k次付款,每次付款最后一位数都会四舍五入,比如95就是付款100,问在最多划分k次且不改变序列的情况下 ,我们能得到的最小花费解题思路:定义dp[i][j]为到第i位的商品划分j次产生的最小花费,我们枚举划分1到k次的情况,在每最多划分j次的状态,且我们已知划分j-1次的答案,我们就可以枚举的j次划分在哪个位置上,从而得到答案.原创 2017-02-22 13:19:33 · 590 阅读 · 0 评论 -
POJ 2152 Check the difficulty of problems(三维dp)
题意:在一次比赛中,有t只队伍参赛,总共有m道题目,现给出每支队伍解出每道题的概率,问满足以下两条件的概率为多少条件1:每支队伍至少解出一道题目.条件2:夺冠的队伍至少解出n道题目.思路:首先用p[i][j]记录第i只队伍解出第j道题的可能性.这个题目每个队伍是一个情况,每个队伍在到第j到题为止解出k道题又是一种状态.所以应该用一个三维dp数组来记录状态原创 2016-08-20 21:25:40 · 403 阅读 · 0 评论 -
POJ 1837 Balance(二维dp)
题意:一个天平,给n个不同长度(g[i])方向的钩子,m个不同重量(w[i])砝码,问有多少钟方法在使用了所有砝码后使得天平平衡.思路:一开始想的 以为钩子也要全部用上,这样就比较简单了,不需要考虑每个钩子情况,统一求正负钩子比例就好,但是交上去错的,去网上看了下才知道其实不用使用全部的钩子.用二维数组来记录状态,dp[i][j]i表示当前以挂上第i个砝码,j表示当原创 2016-08-24 15:21:21 · 367 阅读 · 0 评论 -
POJ 1080 Human Gene Functions(dp)
题意:两个字符串(基因序列),进行分值匹配, 不同字母(基因)匹配有不同分值,可以选择字母与'-'匹配,也有一定分值,最终要求小的字符串在用'-'填充之后去大的字符串长度相等,求总匹配分值最大.思路:和最大公共子序列的问题类似,用dp[i][j]表示到字符q[i]和字符p[j]时当前最大分数,dp[i][j]时可以有三个选择,1.让p[i]和'-'匹配,继承dp[i原创 2016-08-25 19:20:33 · 311 阅读 · 0 评论 -
hdu B-number 3652 数位dp入门 第一发
题意:求小于等于n的数中,有多少数满足带有“13”以及能被13整除。思路:数位dp+取模吧,这是我自己写的第一道数位dp,激动~先介绍dp数组ba, dp[pos][isonethree][mod], pos表示当前位置(从第一位开始),isonethree包含三种状态,2表示已经出现过13,1表示前一位是1,0表示前两种情况都不是,mod表示前几位对13取余的值。原创 2016-10-04 22:22:17 · 478 阅读 · 0 评论 -
hdu 5898 odd-even number (数位dp)
题意:一个数中,每位上数连续是奇数的长度是偶数,每位上数连续是偶数的长度是奇数的数称为odd-even number, 问区间l到r之间的odd-even number数有多少个。l,r的范围为1到9e18.解题思路:数位dp,dp[pos][status][ismax],pos记录当前位置,ismax记录当前是否是边界值,status记录当前状态, 奇数长度为奇数为1原创 2016-10-06 15:32:42 · 407 阅读 · 0 评论 -
hdu 5945 Fxx and game(单调队列,dp)
题意:一开始你将会得到一个数\:XX,每次游戏将给定两个参数\:k,tk,t, 任意时刻你可以对你的数执行下面两个步骤之一:1.\:X = X - i(1 1.X=X−i(1=i=t)。2.\:2.若\:X\:X为\:k\:k的倍数,X = X / kX=X/k。现在Fxx想要你告诉他最少的运行步骤,使\:X\:X变成\:11。思路:从x变成1其实等同于从1变成原创 2017-01-15 10:33:22 · 389 阅读 · 0 评论 -
codeforces 766 c Mahmoud and a Message(dp)
题意:给一串字符串,只包含26个字母,可以把这串字符串分成若干个子串,但是限定每个字母只能出现在长度Ax的子串里,问最多有多少种分割方案,方案数对1e9+7取膜,以及分割子串最大长度,和最少分割子串数量。解题思路:设dp[i]为从0到i这段字符串的分割方案数,为了满足字符a[i]的限定条件,我们只能在i-Ai+1到i之间划分,设len=i-A[i]+1, 但是i-A[i]+1并原创 2017-02-08 17:04:34 · 649 阅读 · 0 评论 -
gdut Problem G: 等凹数字 (数位dp)
Problem G: 等凹数字Description定义一种数字称为等凹数字,即从高位到地位,每一位的数字先非递增再非递减,不能全部数字一样,且该数是一个回文数,即从左读到右与从右读到左是一样的,仅形成一个等凹峰,如543212345,5544334455是合法的等凹数字,543212346,123321,111111不是等凹数字。现在问你[L,R]中有多少等凹数字呢?原创 2017-03-27 17:25:14 · 1409 阅读 · 0 评论 -
poj 2392 Space Elevator(多重背包)
题意:k种石头(不用在意具体是什么东西),每种石头的高度为h,这种石头不能处于超过a的高度,数量为c,问最多能用这些石头叠出多大的高度解题思路:这是一道稍微有点改动的多重背包题目,被改为每种石头都有一个容量限制。多重背包的问题我们可以进行转换,对于c*h>=a的石头,在不超过a的条件下,无论去多少块石头都不会用完c,所以就是可以转换为完全背包问题,而c*h代原创 2017-04-17 20:39:48 · 448 阅读 · 0 评论 -
Find the Marble ZOJ - 3605 概率dp
题意:有n个pots,其中只有第s个pots中有marble,进行m次交换,小明只看到k次交换,问他最有可能猜marble在哪个位置的pots上?代码:推发生概率,可以转换成对情况数的统计,哪种情况多说明哪种概率大。用动态规划可以统计出来。dp[i][j][k]分别表示前i次交换看到j次marble在第k个pots的情况数量。转移方程大概不难想,但是细节要注意下。原创 2017-04-30 08:52:22 · 278 阅读 · 0 评论 -
第八届山东省赛 sdut 3903 CF(贪心+dp)
题意:讲的是打cf的得分机制,给出n个题,每个题有它的初始分数a[i],随时间流逝要扣去的分数的系数d[i],做这道题需要花的时间c[i]。现在给你t时间,问你能获得的最大分数。解题思路:这题一开始想的就是dp,写了一发wa掉了,然后想到需要贪心,比赛就结束了。为什么单纯的for(int i=1; i=0; j--)dp[i]=max(dp[i], dp[i-c[i]]+a原创 2017-05-09 17:16:45 · 506 阅读 · 0 评论 -
51nod 1183 (dp)
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten一字转成sitting:sitten (k->s)sittin (e->i)sitting (->g)所以kitten和sitting的编辑距离是3。俄原创 2017-04-26 15:15:19 · 322 阅读 · 0 评论 -
codeforces 347 D Lucky Common Subsequence(dp+kmp)
题意:给出a,b,c三个字符串,问ab两个字符串最长不包含c的公共子序列。解题思路:基本的思想还是求最长共子序列的dp。但是需要扩展一维,第三维k表示dp[i][j]最长公共子序列的后缀和c的前缀匹配到的位置的下一个位置,每次a[i]==b[j]的时候, 我们去找一下a[i],加上a[i]的子序列和c匹配到的位置,这里利用下kmp就可以,从k开始跑。然后用一个结构体记录原创 2017-05-27 11:49:46 · 580 阅读 · 1 评论 -
zoj 3962 Seven Segment Display(数位dp)
题意:一个8位的十六进制的数字电子显示器,显示每个数字对应每秒要消耗多少点能量,数字每秒钟会加1,问初始数字为x,y秒后消耗多少能量。解题思路:赛场上去找规律做写炸了。赛后才知道可以数位dp搞,于是决定不看题解写一发。写了一发dp[pos][pre]这种状态的数位,示例也不过了,最后发现符合pos,pre状态的情况,他们pos位之前的能量加和是不一样的,所以答案是错的。最后还是原创 2017-04-25 17:02:12 · 760 阅读 · 0 评论 -
codeforeces 792 C. Divide by Three (dp || 贪心)
题意:一个1e5长度的数字,去掉几个数字后让它是三的倍数,要求去掉的数最少,而且要去掉前导零解题思路:一开始瞎贪心,面向数据编程后终于搞出来了。其实总结起来只要注意五种情况1.sum%3==0,直接输出就行2.sum%3==1.去掉一个1。3.sum%3==1.去掉两个2.24.sum%3==2.去掉一个2.5.sum%3==2.去掉两个1对于s原创 2017-03-28 21:57:13 · 419 阅读 · 0 评论 -
hdu 5115 Dire Wolf(区间dp)
题意:n头狼站成一排,击杀其中的第i头狼需要受到a[i]的攻击,每头狼对相邻的狼有攻击加成b[i],问杀死所有的狼最少受到多少点伤害。思路:一道区间dp例题。dp[i][j]表示从击杀第i头狼到第j头狼,我们会受到多少点伤害。dp[i][j]可以由dp[i][k-1],dp[k+1][j]加上k这个点合成,转移方程就是dp[i][j]=min(dp[i][k-1]+原创 2017-04-20 17:34:43 · 491 阅读 · 0 评论 -
spoj Interesting Game (数位dp+nim博弈)
题意:有一个long long 大小的数,alice和bob轮流将其中每一位的数减小任意数量到0为止,将所有位置为0的人赢,每次alice都是先手,问[l,r]区间内有多少个数是alice必赢,多少个数是bob必赢。解题思路:队友cyk推荐的题目,确实蛮有意思的233.减数字游戏其实就是取石子游戏,然后问你l,r区间的话用一下数位dp去求有多少个数每位数^为0就行了。原原创 2017-05-03 16:20:12 · 373 阅读 · 0 评论