![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 60
动态规划
_7许
%
展开
-
HDU - 3530【单调队列】
Subsequence题意给定一个长度为 nnn 的序列,给定一个范围 [m,k][m, k][m,k]。我们需要找到一个最长的连续子序列,满足这个子序列中最大值和最小值的差值在给定的范围 [m,k][m, k][m,k] 内,输出满足条件的最长连续子序列的长度。思路很显然,对于某个位置 iii 作为左端点的连续子序列,其最大值和最小值的差值是单调不减的。所以对于原始序列,我们维护一个单调增队列 INCINCINC 和一个单调减队列 DECDECDEC。显然我们要找的最值的差值就是 dif=D原创 2021-01-18 09:39:57 · 164 阅读 · 0 评论 -
操作集锦
题目链接题意:长度为 nnn 的字符串中有多少个长度为 kkk 并且不同的子序列。定义 dp[i][j]dp[i][j]dp[i][j] 表示截至 s[i−1]s[i-1]s[i−1] 为止,长度为 jjj 的子序列的个数dp[i][j]=dp[i−1][j]+dp[i−1][j−1]dp[i][j]=dp[i-1][j]+dp[i-1][j-1]dp[i][j]=dp[i−1][j...原创 2020-03-31 20:49:09 · 117 阅读 · 0 评论 -
记录一些CF-DP题(qwq)
CodeForces 1195C Basketball Exercise题意:有两排小哥哥,每排都有nnn个小哥哥。我们要从这2n2n2n个小哥哥里选择任意个,使得这些小哥哥的身高总和最大(花痴脸). 限制我们选择的小哥哥不能是一排中相邻的两个。思路:定义dp[ ][3]dp[ \ ][3]dp[ ][3]其中dp[pos][0]dp[pos][0]dp[pos][0]表...原创 2020-03-26 22:07:47 · 270 阅读 · 2 评论 -
树上子链【树形DP】
树上子链备注:一个结点,也可以称作一条链题意:在一棵树上,找打结点权值和最大的子链。思路:将无根树转换为有根树,任意结点为根 在有根树上,设fir[ u ]为在结点u这颗子树上,包含结点u的权值和最大的子链。 同样地,设sec[ u ]为在结点u这颗子树上,包含结点u的权值和第二大的子链。 可以得到dp方程:注意:ans初始化为负无穷,结点权值是有赋值的嘛 an...原创 2020-02-23 15:45:42 · 333 阅读 · 0 评论 -
洛谷 P1886 滑动窗口 /【模板】单调队列
洛谷 P1886 滑动窗口 /【模板】单调队列用数组que模拟双端队列(前后都可踢出元素)#include <iostream>#include <cstdio>#include <cmath>#include <string>#include <cstring>#include <algorithm>...原创 2020-01-11 22:00:32 · 193 阅读 · 0 评论 -
【分组背包】HDU 1712 ACboy needs your help
HDU 1712 ACboy needs your help题意:N门课程,有M天时间。【每门课程花费1-M天可以获得的价值不同】,问怎么选择花费在每一门上的课程能获得最大价值,输出最大价值。思路:分组背包模板题每一门课程的时间选择都是冲突的,只能选择一个。那么每一门课程就是一个组别,并且天数的选择是冲突的,只能选择一个。就典型的分组背包问题。第一层循环是枚举每一个组别 k...原创 2020-01-10 11:56:50 · 170 阅读 · 0 评论 -
【状压DP】POJ 2411 Mondriaan's Dream
POJ 2411 Mondriaan's Dream题意:给一个n*m大的区域,问用1*2的矩形块填充,能够刚好填满的填充方式有多少?FEELING:真的吹爆神犇!!www,这个方法也太巧妙了叭qaq!!!!大神思路蒟蒻理解:dp[i][s]: 第 i 行状态为s的种类数(保证前i - 1行是全部覆盖的)我们用01表示(i , j)格子有没有被覆盖,那么每一行都会有一个01串...原创 2020-01-09 16:52:24 · 149 阅读 · 0 评论 -
【状压DP_TSP】HDU 5067 Harry And Dig Machine
HDU 5067 Harry And Dig Machine题意:有一个n*m的图,每个方格有[0, 100]数量的石子。从(0, 0)出发,到达所有有石子的方格,每个方格都只能经过一次,最终回到(0, 0),两个结点间的距离为曼哈顿距离,问最短路径。TSP:Traveling Salesman Problem一个旅行商要拜访n个城市,路径的限制是每个城市只能拜访一次,而且最后要回到...原创 2020-01-09 12:00:25 · 267 阅读 · 0 评论 -
【树形DP_树的直径】HDU 4607 Park Visit
HDU 4607 Park Visit题意:一个有N个结点的无根树,我们要访问K个点,问最小路径是多少。解:我们设树的直径是dia,直径上经过的结点个数为num 当K <= num时,ans = K-1. (从直径的一端沿着直径走) others,ans = dia + (K - num) * 2(直径一定是走完的,还要走直径的分支,并且分支是走重复的,也就是两倍)...原创 2020-01-08 22:22:07 · 344 阅读 · 0 评论 -
【数位DP】BZOJ 3679: 数字之积
BZOJ 3679: 数字之积题意:求[L, R)区间内,各个数位之积在(0, n]的数的个数。思路:因为L,R的范围有1e18,如果每个数位都是9,9^18是最大的乘积了吧www……是不可能开的下数组的。那怎么办,我们怎么处理乘积呢?首先说,n的范围是<=1e9,所以一旦大于1e9我们可以直接return 0. 那么问题就变成了怎么处理1e9之内的乘积。(还是很大啊qaq)。...原创 2020-01-08 20:16:37 · 374 阅读 · 0 评论 -
【数位DP-三维dp数组】HDU 3652 B-number
HDU 3652 B-number题意:给一个数n,求区间[1, n]中具有连续13,并且可以可以被13整除的数的个数。思路:对于一个数来说,它有两个固有性质。1:是不是13的倍数. 2:有没有连续数位为13. 我们的dp数组如何来表示出所谓无后效性就很重要。我们可以用一维来表示是不是满足性质2,再用一维表示它mod13的余数。那么dp也就是一个三维数组。实践证明两维真的不可。第一道...原创 2020-01-08 10:44:50 · 287 阅读 · 0 评论 -
【树形DP_树的直径】HDU 2196 Computer
HDU 2196 Computer题意:给一棵树,求每个结点的最大距离(从该结点到达所有叶子结点中的最大距离)并输出。题目要求输入真的很迷,每一行(从2开始)代表的结点u和输入结点v之间的边的权值是w。嗐,真的迷。读了好久才读懂。QAQ【今天才知道原来以下做法是求树的直径的做法,first[x] + upp[x]的最大值就是树的直径】思路:我们任取一个结点作为根结点,将无根树转...原创 2020-01-07 19:55:02 · 246 阅读 · 0 评论 -
【树形DP-最大独立集】HDU 1520 Anniversary party
HDU 1520 Anniversary party题意:开大Party啦啦啦!但是主办方很人性,不让直属上下司同时出席。所以最多能有多少人出席呢?但是并不是问这个QAQ。每个人有自己的happiness值,问最大的happiness值是多少呢?最大独立集定义:一颗有N个结点的无根树,选出尽可能多的结点,使得任何两个结点均不相邻,那么这个点集就称为最大独立集。如何求解呢?我们任...原创 2020-01-07 11:55:21 · 146 阅读 · 0 评论 -
【区间DP first】POJ 2955 Brackets
POJ 2955 Brackets如果s[st] == s[ed],那么dp[st][ed] = dp[st + 1][ed - 1] + 2。(这个放在枚举断点之前)其实想想确实是这样的,两端相等,那么就该初始化为去头去尾的中间的子串的dp值再加上2然后就开始枚举断点,更新dp为尽可能的大,大区间等于两个小区间相加区间DP的一般步骤:枚举长度枚举起点枚举断点(更新dp)...原创 2020-01-06 21:50:15 · 130 阅读 · 0 评论 -
【期望DP】LightOJ 1030 - Discovering Gold
LightOJ 1030 - Discovering Gold题意:在一个1*N的图中。起始点在1,掷骰子,下一个位置为当前位置+掷出的骰子点数。每个格子有各自的黄金数量。必须要走到最后一个格子N,如果距离小于6并且掷出的点数超出了N,那么可以多次掷骰子,直到下一个位置在范围内为止。思路:期望DP模板。期望DP:离散期望=值*概率 的和必须从后往前推期望值。因为前边的期望会影...原创 2020-01-06 21:14:12 · 156 阅读 · 0 评论 -
【区间DP】Light OJ 1422 - Halloween Costumes
Light OJ 1422 - Halloween Costumes当a[st] == a[ed]时,非常容易知道完全可以把中间的衣服脱掉只剩最里面那一件,所以容易得到dp[st][ed] = dp[st][ed - 1]否则,就还是采用枚举断点的方式,等于小区间相加也就是dp[st][ed] = dp[st][mid] + dp[mid + 1][ed]something:...原创 2020-01-06 19:52:44 · 143 阅读 · 0 评论 -
【树形DP-树的重心】POJ 3107 Godfather
POJ 3107 Godfather题意:给出一个无向图(保证是树)【无根树】,求树的重心并输出关于树的重心:该结点的子树中的最大结点数最小,则该结点是树的重心。也就是去掉重心后,剩余连通块中的最大连通块最小。关于树的重心的几点性质:一棵树最多有两个重心,且相邻。 把两棵树通过一条边相连,新的树的重心在原来两颗树重心的连线上。 树上所有点到某个点的距离和中,到重心的距离和是最...原创 2020-01-06 19:14:48 · 164 阅读 · 0 评论 -
【区间DP】HDU 4632 Palindrome subsequence
HDU 4632 Palindrome subsequence题意:让找一个字符串中回文子序列的最大数量。举两个栗子://aaa/* len = 2 */dp[1][2] = dp[1][1] + dp[2][2] + 1 = 3;dp[2][3] = dp[2][2] + dp[3][3] + 1 = 3;/* len = 3 */dp[1][3] = dp[1][2]...原创 2020-01-06 14:24:41 · 141 阅读 · 0 评论 -
【数位DP(前导零的处理)】POJ 3252 Round Numbers
POJ 3252 Round Numbers题意:求区间中二进制表示0的个数不小于1的个数的数的个数思路:这个必须要考虑前导零的影响,所以设置一个布尔变量,用来记录当前位的高位是不是都是0。然后的话cnt初始值设为32(int最大数位为32位),如果高位有1,且当前位为0,那么cnt + 1;当前位为1,那么cnt - 1。跑完所有的数位之后,如果cnt >= 32就说明0的...原创 2020-01-05 20:44:24 · 309 阅读 · 0 评论 -
【数位DP(Sub)】HDU 4734 F(x)
HDU 4734 F(x)思路:dfs里的cnt指的是当前pos位,高位还需要凑cnt的价值和。例如211。第2位2,对应的cnt = 0第1位1,对应的cnt = 0 + 2*(1 << 2) = 8第0位1,对应的cnt = 8 + 1*(1 << 1) = 10第-1位,对应的cnt = 10 + 1*(1 << 0) = 11拿第-1位来...原创 2020-01-05 19:13:34 · 161 阅读 · 0 评论 -
【数位DP】HDU 2089 不要62
HDU 2089 不要62题意:求[n, m]中没有连续62并且没有4的数的个数。其中n和m的范围是1e6解:其实最关键的部分就是dfs的部分。首先我们将每个数位的值保存在一个数组里。解释一下dfs参数的意义:pos:第几个数位。例如100,pos分别为2,1,0pre:高一位数位的值。例如67,数位0的高一位数位是1,值为6。(它存在的意义是因为62连续是不合法的)st...原创 2020-01-05 11:16:16 · 148 阅读 · 0 评论 -
【DP_构成状态的种类数】HDU 1398 Square Coins
HDU 1398 Square Coins题意:有1->17的平方数价值的金币,问用这些金币组成1->300内任意价值,有多少种组合方法。思路:我们从小到大依次用这些平方数来组成1->300的价值1:dp[ i ]=1;4:dp[ 4 ]+=dp[ 4-4 ]=2; dp[ 5 ]+=dp[ 5-4 ]=2; dp[ 9 ]+=dp[ 9-4 ]=3;9:dp[ 9 ...原创 2019-07-20 08:38:00 · 150 阅读 · 0 评论 -
【简单DP】HDU 1260 Tickets
【第二次排位_Attempted】HDU 1260 Tickets题意:有K张单人票,有各自的出票时间,有K-1张双人票,有各自的出票时间。这个双人票是第(1,2)(2,3)(3,4)……这样的组成两个人的出票时间。问最少多长时间卖掉所有的票。DP方程列出来做就是了。My_Feeling:比赛的时候还有不到半个小时做这道题,一直没有读懂题。太诡异了这个题意。按照正常生活中电影票出,肯定是一...原创 2019-07-19 15:37:58 · 153 阅读 · 0 评论 -
FatMouse and Cheese(HDU1078)(记忆化搜索)
FatMouse and CheeseTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)题意:n*n的网格,每个格子有不同数量的cheese,小老鼠从(0,0)出发,每到一个格子就把cheese吃掉,并且必须每次吃的cheese数量比上一次多才行。老鼠只能垂直水平方向最多走k步,...原创 2019-07-11 21:38:59 · 180 阅读 · 0 评论 -
Coins (POJ 1742)(多重背包QAQ)
Coins (POJ 1742)【Time Limit: 3000MS Memory Limit: 30000K】题意:n种货币,每种货币两个属性:a[ i ] (价值),c[ i ] (数量);商品价值上限m。问有多少种价格的商品可以不找零买到。题解:这是一个多重背包的问题,可能会想到用二进制优化,但是算一下时间复杂度是过大了的,实际也会T。所以我们用另外一种方式来做:dp[ i ]用...原创 2019-07-10 15:12:24 · 170 阅读 · 0 评论 -
Piggy-Bank(HDU 1114)(完全背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114题意:我们知道存钱罐存放的coins的重量为C,有N种coin,每种coin有两种属性:p(价值),w(重量),该重量下让我们求最少的coins的价值。题解:我们用dp[ i ]来表示重量为i的时候最少的金币价值。我们对dp进行初始化,因为price的范围在[1,5e4],然后dp是pri...原创 2019-07-08 21:20:59 · 129 阅读 · 0 评论 -
最少拦截系统(上升子序列&&贪心)(HDU 1257)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257题意:导弹拦截系统的炮弹只能一次比一次低,敌方有不同高度的导弹发射过来,问我们至少要多少个导弹拦截系统。题解:我们用dp[ i ]来表示第i个导弹拦截系统炮弹的最大可达高度。我们先初始化dp[ 1 ]为a[ 1 ],接下来我们跑一个 i=2->n 的for循环,看最小的dp是不是能拦截...原创 2019-07-08 20:58:37 · 131 阅读 · 0 评论 -
Super Jumping! Jumping! Jumping!(HDU 1087)(上升子序列dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <cstring>...原创 2019-07-08 19:41:09 · 117 阅读 · 0 评论 -
最长上升子序列模板(HDU 1950 Bridging signals)
我觉得这篇讲的很好:https://blog.csdn.net/lxt_Lucia/article/details/81206439最长上升子序列 O(n^2)dp模板const int maxN=4e4+5;const int maxC=1e6+5;int T,n,dp[maxN],a[maxN],ans;void init(){ fill(dp,dp+n+1,1); ...原创 2019-07-08 19:32:59 · 231 阅读 · 0 评论 -
Common Subsequence(最长公共子序列)(HDU 1159)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159题意:两个字符串,求最长的公共子序列的长度。题解:开一个二位dp[i][j]:截至s1[i],s2[j]为止的最长公共子序列的长度。我们跑两个for循环,如果 s1[i]==s2[j] 我们就可以将这个字符放入公共子序列中,这时候dp[i][j]=dp[i-1][j-1];如果 s1...原创 2019-07-08 10:47:50 · 162 阅读 · 0 评论 -
Dividing(HDU 1059)(多重背包_二进制优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059题意:有价值分别为1,2,3,4,5,6的marbles(大理石)若干,问是否能使这些marbles平分。【marbles总数不超过2e4(很明显这是一个大常数,所以用二进制优化来做)】My_idea(关于二进制优化)首先的话我们先看14=1+2+4+7({1,2,4,7}可以组成1到14之...原创 2019-07-06 11:46:22 · 225 阅读 · 0 评论 -
Max Sum(HDU 1003) && 最大连续子序列(HDU 1231)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003代码:#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <cstring&...原创 2019-07-05 19:36:15 · 119 阅读 · 0 评论 -
寒冰王座(HDU 1248)(完全背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1248代码:#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <cstring&...原创 2019-07-05 19:23:15 · 311 阅读 · 0 评论 -
I NEED A OFFER!(HDU 1203)(01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203代码:#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <cstring&...原创 2019-07-05 19:21:30 · 341 阅读 · 0 评论 -
FATE(HDU 2159)(完全背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159代码:#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <cstring&...原创 2019-07-05 19:12:28 · 160 阅读 · 0 评论 -
数塔(HDU 2084)【记忆化搜索】/【DP递推】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084题目大意:就是一个数塔,从头走到顶,问路径最大的和是多少。题解:如果我们搜索所有路径,一共有2^n-1种路径,时间复杂度太大了。或者我们直接用递归,还是会重复走一些结点,要走的结点一共有2^n-1个,跟搜索所有路径是一样的。所以考虑下面两种方法。前话:dp [ i ] [ j ]是数塔...原创 2019-07-05 17:20:54 · 259 阅读 · 0 评论 -
HDU 2191(多重背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191代码:#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <cstring&...原创 2019-07-04 21:40:35 · 141 阅读 · 0 评论 -
Big Event in HDU(HDU1171)(多重背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171代码:#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <cstring&...原创 2019-07-04 21:39:00 · 101 阅读 · 0 评论 -
Charm Bracelet (POJ 3624)(01背包)
题目链接:http://poj.org/problem?id=3624题目大意:01背包问题代码:#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <cstring>...原创 2019-07-04 11:25:11 · 167 阅读 · 0 评论