
DP
notmuch
这个作者很懒,什么都没留下…
展开
-
蓝桥杯系列 - 2018国赛 - 调手表
很明显的动态规划,设置 dp[n],dp[i] 表示调到数字 i 所需的最少步数。这道题的状态转移方程很简单:dp[i] = min(dp[i - 1], dp[(i - k) % n]) + 1不过,这道题难的地方就在于,dp 的初始化比较难想到,有一点比较细。正确的初始化方案如下:// 从 0 位置开始, 逐次往后跳 1 步for i in [0, n - 1]: dp[i] = i// 从 k 位置开始, 逐次往后跳 k 步, 根据数学关系可推导出最多跳 n * k / gcd(n,原创 2021-05-08 15:57:42 · 348 阅读 · 1 评论 -
Leetcode87. 扰乱字符串 —— 区间DP
这道题应该是比较明显的区间DP问题了。状态定义:dp[l, i, k] 表示 s1[i~i+l-1] 通过扰乱后能否与 s2[k~k+l-1] 相同(True / False),易知 l 表示字符串 s1 和 s2 的子串的长度。状态初始化:1. dp[0][i][k] = False, for i in [0, length] andfor kin [0, length]""" length 为字符串 s1 和 s2 的长度,dp[0][i][k] 设置为 False 的原因是以 ..原创 2021-04-16 18:56:19 · 132 阅读 · 0 评论 -
牛客IOI周赛23-普及组 D题 - LIS变形
很容易看出,将原数组从小到大排序,就可以按照LIS的DP套路来解这道题了。但是,一般情况下LIS是O(n^2),用在这道题会被卡。LIS可以优化做到O(nlogn),参照LIS的优化也是有可能解出这道题的,但比赛时一直想不出来。看了他人的题解后才明白的。首先是dp状态的定义:dp[i]: 表示以数字i为结尾的最长好序列的长度。注意,这里是指以i为结尾,而不是以b[i]为结尾(b[0 ~ n - 1]为原数组)。转移方程:dp[i] = max(dp[j]) + 1 for j < i原创 2021-03-06 19:55:08 · 155 阅读 · 0 评论 -
牛客NC13593 一起来数二叉树吧 - 动态规划
dp[i][j]:结点数为i,叶子数为j时二叉树的数量。状态转移方程:令x,y分别表示二叉树的左子树的结点数和叶子数,则二叉树的右子树的结点数和叶子数为i - x - 1,j - y。dp[i][j] = dp[x][y] * dp[i - x - 1][j - y] for 0 <= x < i, 0 <= y <= min(x, j)。其实这个解法会使左右子树对称的二叉树被重复计数,但这道题好像把对称的二叉树看成两个不同的二叉树,所以才可以这么解题。#inc原创 2021-02-21 10:51:59 · 184 阅读 · 0 评论 -
洛谷P1736 创意吃鱼法(DP)
题意大概就是要从一个n * m的矩阵当中,求出一个主对角线或者副对角线都是1,其它地方都是0的最大正方形,并输出它的边长。最暴力的方法应该就是枚举,对于任何一点(i , j),枚举它作为正方形的左上顶点/右上顶点时,能够构成的合法的最大正方形,怎么判断这个正方形是合法的呢?最简单的应当就是分别判断主副对角线是否都为1,再判断其余部分是否都为0。但是这么枚举的话,多半是会TLE的,所以我们要考虑优...原创 2019-08-26 11:01:15 · 190 阅读 · 0 评论 -
洛谷P2214 [USACO14MAR]哞哞哞Mooo Moo(完全背包)
设a[i]为第i个农场的总音量,如果我们将a[i]减去a[i-1]-1(前提是a[i-1]不为0),设最终为b[i],就不难发现,其实就相当于完全背包问题,要我们用B种物品去,以最少的数量去填满容量为b[i]的背包。因此,我们只需对逐个弄场求完全背包,把最终结果相加即可。#include<cstdio>#include<iostream>#include<cst...原创 2019-08-24 21:35:02 · 407 阅读 · 0 评论 -
UVA 10635,Prince and Princess(LCS→LIS优化)
原本是用LCS优化过的,后来看到有些大牛都是10MS就过的,觉得甚是神奇,就去查了一下,原来可以将LCS转为LIS,而LIS可以有NlogN的算法。关于LIS的NlogN的做法,可看博客:https://blog.youkuaiyun.com/shuangde800/article/details/7474903LCS→LIS,可看博客:https://blog.youkuaiyun.com/guogaoan/a...原创 2019-08-11 12:33:36 · 189 阅读 · 0 评论 -
洛谷P1020 导弹拦截(LIS优化)
#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;const int maxn=1e5+10;const int inf=0x3f3f3f3f;typedef long long ll;int dp[max...原创 2019-08-15 00:09:12 · 204 阅读 · 0 评论 -
洛谷P1049 装箱问题(01背包变形)
题意:给你一个箱子体积为V,有n个物品,每个物品有一个体积v[i],要在求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。每个物品同样只能取一次,01背包问题变形。#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespac...原创 2019-08-14 20:56:39 · 148 阅读 · 0 评论 -
洛谷P1064 金明的预算方案(分组背包)
其实一开始并不是用分组背包AC的(当是还没学),而是01背包加分类讨论过的,但写的很复杂,觉得应该有更简单的算法,查了才知道可以用分组背包的。分组就是将主件与附件看成是同一组内的,主件与其他主件为不同组。同一组内有4种方案,取主件,取主件+附件1,取主件+附件2,取主件+附件3,这几个方案都是互斥的,符合分组背包的特点。分组背包的AC代码:#include<cstdio>#in...原创 2019-08-14 20:38:53 · 184 阅读 · 0 评论 -
洛谷P1164 小A点菜(01背包变形)
题意:你有M元钱,有N道菜,所有菜只能点1次,每道菜价格v[i],问恰好花完所有钱的方案数。状态:dp[i,j]表示选到第i道菜时,恰好话费j元的方案转移方程:dp[i,j] = dp[i-1,j] + (j<v[i])? 0 : dp[i-1,j-v[i]].#include<cstdio>#include<algorithm>#include<cs...原创 2019-08-14 15:48:52 · 164 阅读 · 0 评论 -
UVA 10635,Prince and Princess(DP)
读懂题意不难看出这是一道最长公共子序列的裸题。然而,事情并没有想象中的那么简单,这道题每个串最大250*250=62500,即时间复杂度最坏625002!!!即使时间限制3000MS也不可能跑过,再者,这么大也开不了二维DP数组。因此必须进行优化。联想到背包问题中可以用滚动数组,引用到这里也可以,于是空间问题解决了,那么对于时间,该怎么优化呢?我们定义DP状态为:dp[i]表示p[1 ~ ...原创 2019-08-06 16:47:15 · 122 阅读 · 0 评论 -
洛谷P1091 合唱队形(LIS)
题意不难理解,这里就不说了。思路就是开两个数组fro[n],back[n],先从头到尾求一遍LIS,记录在fro[n]中,再从尾到头求一遍LIS,记录在back[n]中,最后遍历fro[n],back[n],符合要求的最长队列就是max(fro[i]+back[i]),最终答案就是n减去这个数了。注意:这里求LIS是要用朴素的n2算法,才可以去解这道题,否则可能不行。#include<...原创 2019-08-15 23:31:56 · 128 阅读 · 0 评论 -
洛谷P1006,传纸条(DP)
可以设置四维DP:dp[i,j,k,l]表示小渊走到( i, j ),小轩走到( k, l )时收获的最大好心值。因为小渊和小轩都有两个方向走,所以dp[i,j,k,l]是从四种可能的状态转移过来的:dp[i,j,k,l]=max(dp[i-1,j,k+1,l],dp[i-1,j,k,l+1],dp[i,j-1,k+1,l],dp[i,j-1,k,l+1]) + map[i,j] + map...原创 2019-08-21 23:59:42 · 203 阅读 · 0 评论 -
洛谷P1417 烹调方案(01背包+贪心)
题意:n个物品,T个时刻,每个物品只能制作一次,制作需要ci的时间,在t时刻完成第i样物品可以得到ai−t∗bi的价值,问在T的时间内最多能得到多少价值。详解见博客:https://www.cnblogs.com/BCOI/p/8999396.html这道题长得很像01背包,但是单纯按01背包去做肯定是错的,因为哪样物品先做,哪样物品后做是会影响最终价值的,也就是与做的顺序有关。这里很容易想到...原创 2019-08-22 22:17:05 · 172 阅读 · 0 评论 -
洛谷P1855 榨取kkksc03(二维费用背包)
二维费用背包裸题。#include<cstdio>#include<algorithm>#include<cstring>#include<algorithm>#include<iostream>#include<stack>#include<vector>#include<cmath>...原创 2019-08-26 11:02:41 · 204 阅读 · 0 评论 -
洛谷P1880 [NOI1995]石子合并(区间DP)
石子合并是个经典的区间DP模型,然而之前并没有做过。。。关于石子合并可以看下这个博客:https://blog.youkuaiyun.com/riba2534/article/details/76045531代码如下:#include<cstdio>#include<iostream>#include<algorithm>#include<cstring...原创 2019-08-28 15:44:48 · 172 阅读 · 1 评论 -
HDU2059,龟兔赛跑(DP)
题中有N个充电站,我们另外添加两个充电站,一个在起点,另一个在终点,则可以定义DP:状态:dp[i]表示到达第i个充电站所需的最短时间。状态转移方程:dp[i]=min(dp[j]+T)+第j个充电站到第i个充电站的时间。这里加T是表示从j充满电后出发到i。注意:不必考虑在第k个充电站没充电的情况,因为这种情况其实已经涵盖在k之前的状态了。举个例子,假如在上述转移方程中,我们找到了min(...原创 2019-09-04 22:38:49 · 226 阅读 · 0 评论 -
2019 ICPC Malaysia National,E. Optimal Slots(01背包变形)
大致题意:给定T和N个数,在N个数当中选出一些数相加,得到sum,你的任务就是要使sum<=T且T-sum要尽可能小,最后按照编号顺序输出你的方案,最后再输出sum。如果有多个方案,编号小的优先。限制条件:1<=N<=50, 1<=T<=1000.这道题很坑的地方就是题中是没有给出T的范围的(本人是在CF上做的,至少在CF上是没有的),只给出N的范围。所以刚开始看...原创 2019-09-06 19:43:08 · 250 阅读 · 0 评论 -
洛谷P1714 切蛋糕(单调队列优化DP)
题意很清晰,就不多讲了。我们不难想到可以用DP来做:dp[i]表示以第i块蛋糕为结尾时,所能获得的最大幸运值。记sum[i]为1~i块蛋糕的幸运值的总和。则状态转移方程:dp[i]=sum[i]-min(sum[j]), i-m<=j<=i。当j==i的时候,表示一块蛋糕也不吃,这种情况是允许的。于是,我们只要在[i-m,i]之中找到最小sum值,就可以完成状态转移。朴素算...原创 2019-09-09 11:27:59 · 309 阅读 · 0 评论 -
洛谷P1725 琪露诺(单调队列优化DP)
题意:输入n,l,r,有a[n+1]个数,a[0]=0,一开始你的位置在0,要往前跳,每次只能跳到[i+l,i+r]区间内的位置,跳到k位置就会得到价值a[k],你的任务就是从0开始跳直到你的位置超过位置n,且所得的价值最大。可以用DP来做。dp[i]表示跳到i位置时所能获得的最大价值。显然dp[i]=max(dp[k])+a[i], i-r<=k<=i-l。于是我们可以用一个...原创 2019-09-10 19:10:41 · 287 阅读 · 0 评论 -
2019牛客暑期多校训练营(第五场)G(DP)
题意:给定一个长度为n,m的只包含’0’~'9’的字符串s[n],t[m],问s[n]中有多少个子序列的大小(不含前导0)比t[m]大。本题要分类讨论,无分类讨论的话,会复杂很多。1.s[n]中子序列长度大于m的情况,此时可以枚举开头位置和 子序列长度,套用组合公式计算;2.s[n]中子序列长度等于m,且大于t[m]的情况,可以用DP解决。如果能想到分类讨论,这道题就简单很多了,不过DP的...原创 2019-08-03 23:09:59 · 160 阅读 · 0 评论 -
牛客15669,躲藏(DP)
题意:在一段字符串中,Cwbc作为子序列出现了多少次(不分大小写)。首先因为只找Cwbc,可以先进行预处理,把原串s[n]去除掉其他字母,形成只包含c,w,b三种字符的串s0[m],接下来对s0进行DP。根据题意,既然要找cwbc这个串出现了多少了,那么可以定义:状态:dp[i,j]表示s0[0~i]中字符串t[0 ~j]出现了多少次(其中t[]=“cwbc”)状态转移方程:dp[i,j...原创 2019-07-31 10:29:26 · 206 阅读 · 0 评论 -
牛客25147,金币馅饼(DP)
要从(1,1)走到(R,C),根据走的方式,可以定义以下的状态和方程。状态:dp[i,j]表示走到(i,j)位置时能够获得的最大金币数状态转移方程:if(i!=j) dp[i,j]=max(dp[i-1,j-1],dp[i,j-1],dp[i+1,j-1])+map[i,j]else dp[i,j]=dp[i-1,j-1]+map[i,j]边界:dp[1,1]=map[1,1],其余初...原创 2019-07-31 10:16:31 · 245 阅读 · 0 评论 -
杭电ACM——humble numbers(DP)
突破口:状态是线性的,只需一维数组dp[n]。dp[i]表示第i个humble number,humble numbers是递增序列,因此dp[i]>dp[i-1],且是第一个大于dp[i-1]的,dp[i]一定是由前面某个数乘上2,3,5或7得到的。先用2去乘dp[i-2]及其后面的数,直到2×dp[k]<=dp[i-1],此时记录下2×dp[k+1]的值,改用3×dp[k]及其后面...原创 2019-03-27 22:07:28 · 321 阅读 · 0 评论 -
北大ACM——2385,Apple Catching(DP)
dp[T,W,N]: 在T分钟,移动次数剩余W次时,在第N棵树下可以拿到的苹果的最大数量。简化:一开始因为奶牛是在第一棵树,而苹果树只有两棵,因此奶牛的位置可以由剩余移动次数W来确定,故dp[T,W,N] → dp[T,W]: 在T分钟,移动次数剩余W次时,奶牛可以拿到的最大苹果数。设置数组a[T],记录T时间哪个位置有苹果。状态转移方程:if(a[i]==1){if(W与W0奇偶...原创 2019-04-05 16:59:17 · 191 阅读 · 0 评论 -
杭电ACM——毛毛虫(DP)
状态:dp[k,i]原创 2019-03-26 20:33:33 · 303 阅读 · 0 评论 -
杭电ACM——fatmouse's speed(DP)
最长递增子序列(与最大递增子序列基本一样)状态:dp[i]:前i个数当中,以a[i]为结尾的递增子序列的最大长度状态转移方程跟之前写的那篇最大递增子序列的差不多#include<cstdio>#include<algorithm>#include<cstring>#define inf 100000using namespace std;int ...原创 2019-03-25 16:56:27 · 266 阅读 · 0 评论 -
杭电ACM——1087,Super Jumping! Jumping! Jumping!(DP)
最大递增子序列问题状态:dp[i]:前i个数当中所能构成的最大递增子序列的各数字之和;状态转移方程在代码中解释#include<cstdio>#include<algorithm>#include<cstring>#define inf 100000000000using namespace std;long long dp[1001],a[10...原创 2019-03-25 15:50:46 · 240 阅读 · 0 评论 -
杭电ACM——1003,Max Sum(DP)
突破口:把握好sum<0的意义#include<cstdio> #include<iostream>using namespace std;int a[100005];int main(){ int T,n,i,kase; int max,sum,start,end,st,et; //max作为最终输出的答案,sum作为游标,去探测 scanf("...原创 2019-03-20 21:58:26 · 240 阅读 · 0 评论 -
北大ACM——3186,Treats For The Cows(DP)
题意:有n个treats放在一个长长的箱子里,只有箱子两端有开口,第i个treat的价值为v[i],每个treat可获利v[i]*a,其中a为treat的“年龄”,显然“年龄”越大越值钱。每天只能卖出一个treat,设第一天a=1,随天数递增1,求能获得的最大价值。分析:这道题一开始以为好像很简单,觉得只要用一维的dp就够了,当时的状态是这样子的:dp[i]:表示前i天所能获得的最大价值;后...原创 2019-03-15 15:27:00 · 387 阅读 · 0 评论 -
北大ACM——2229,Sumsets(DP或思维)
题意:给定一个数N,要求出用2的次幂组成的等式的和等于N,输出有多少个符合条件的等式。如7,输出6:1+1+1+1+1+1+11+1+1+1+1+21+1+1+2+21+1+1+41+2+2+21+2+4限制条件:1&lt;=N&lt;=1000000,结果对1e9取余。这道题可以dp来做。设置一个二维数组dp[i,j],以及辅助数组c[i],c[i]表示2i。状态:dp[...原创 2019-03-15 15:27:29 · 217 阅读 · 0 评论 -
北大ACM——3176,Cow Bowling(动态规划)
这道题跟数塔一模一样,还是从数字金字塔的顶端往下走,要求出最终的位置所得到的数字之和最大。思路:从下往上走,而非从上往下走。设置dp[i,j]数组,dp[i,j]表示:当走到(i,j)位置时,所能获得的最大数字。由于(i,j)位置的数字和,只能由(i+1,j)和(i+1,j+1)位置推出,因此,该问题的状态转移方程应该为:dp[i,j]=max(dp[i+1,j]+a[i,j],dp[i+1,...原创 2019-03-07 13:04:05 · 253 阅读 · 0 评论 -
杭电ACM——天上掉馅饼(DP)
注意点:time=1:活动范围为4-6;time=2:3-7;time=3:2-8;time=4:1-9;time=5:0-10(全范围)突破口:状态:dp[i,j]在i秒,j位置能获得的最大饼数状态转移方程:dp[i,j]=max(dp[i-1,j],dp[i-1,j-1],dp[i-1,j+1]);此题涉及到一些代码技巧,要多注意。代码如下:#include<cs...原创 2019-03-28 15:07:03 · 399 阅读 · 0 评论 -
北大ACM——3616,Milking Time(DP)
突破口:只要发现DP对象是间歇M,便可发现本质是最大递增子序列。代码如下:#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;long long dp[1005];struct mt{ int s,t,e...原创 2019-04-11 10:38:38 · 187 阅读 · 0 评论 -
牛客,被3整除的子序列(DP)
刚做完2019牛客暑期多校训练营(第四场)K题,来巩固DP内容的时候,第一道题就遇到了这道,它与那道K题很相似,所以才比较有思路。状态:dp[k,i]表示s[0]~s[i]这段串中,子序列各数字之和mod3=k的总个数;状态转移方程:根据状态定义,我们可以知道,当k=0,则dp[0,i-1]表示s[0]~s[i-1]子序列和mod3=0的总个数,dp[0,i]表示s[0] ~s[i]的子序列...原创 2019-07-29 11:52:53 · 182 阅读 · 0 评论 -
2019牛客暑期多校训练营(第四场)K
可以用DP来做,可参考博客:https://www.cnblogs.com/Yinku/p/11256242.html状态:dp[k,i]表示以s[i]为结尾,前缀和mod3=k的子串个数;边界:dp[0~2,0]=0,dp[s[i]%3,0]++;状态转移:设s[i]数字为c,dp[c%3,i]=dp[0,i-1] (以s[i-1]结尾前缀和mod3=0的方案数可以归入dp[c%3...原创 2019-07-29 10:19:15 · 124 阅读 · 0 评论 -
北大ACM——3280,Cheapest Palindrome(DP)
非常经典的区间DP!!!可参考博客:https://blog.youkuaiyun.com/zhhx2001/article/details/51656340代码如下:#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>...原创 2019-05-11 19:07:23 · 322 阅读 · 0 评论 -
北大ACM——3046,Ant Counting(DP)
题意:有T种蚂蚁,总共A只,求将这些蚂蚁,分为数量为S,S+1,S+2,…,B的集合的总集合数。突破口:设置a[T]记录每种蚂蚁的数量,设置dp[i,j]表示,用前i种蚂蚁,构成数量为j的集合的最大集合数,那么,第i种蚂蚁有用0只,1只,…,a[T]只,因此,状态转移方程应为:dp[i,j]=sum(dp[i-1,j~j-a[T]]).代码如下:#include<cstdio>...原创 2019-05-07 23:01:36 · 231 阅读 · 0 评论 -
北大ACM——1742,Coins(多重背包)
多重背包问题。详解见博客:https://blog.youkuaiyun.com/Estia_/article/details/83590060这道题时间卡得超严,在看大佬的代码之前疯狂TLE。代码如下:#include<cstdio>#include<iostream>#include<cstring>using namespace std;typede...原创 2019-05-10 17:36:57 · 224 阅读 · 0 评论