![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dp
多行不译必自闭
人生如逆旅,我亦是行人
展开
-
区间dp -- You Are the One HDU - 4283
You Are the One HDU - 4283题意:由T个测试样例,每个样例有n(1 <= n <= 100)个数d[i] (0 <= d[i] <= 100),如果的d[i]是第k个算贡献,则的d[i]的贡献是(k - 1)* d[i],先在给你一个栈,你可以任意时间把d[i]放入栈中或从栈中取出,以此来控制算贡献的顺序。求最小贡献。思路:f[i][j]表示把区间 [i, j] 翻转过来的贡献和,栈的作用就是把进栈的区间 [i, j]翻转顺序。dp[i][j]表原创 2020-11-18 22:52:12 · 84 阅读 · 0 评论 -
区间dp -- Food Delivery ZOJ - 3469
Food Delivery ZOJ - 3469题意:在一条笔直的街道上有有一个餐馆和 n 户居民,每户居民都会在餐馆订餐,餐馆的坐标为X,参观送餐的速度是1 / V,每户居民都有两个属性x、 b,分别表示自己在街道上的坐标、单位时间内对餐馆送餐速度焦虑值。请你规划一种送餐策略,求所有居民对餐馆最小的焦虑值。思路:每次出发有两种选择,要么向左走到第一个没被送餐的居民,或者向右走到第一个没被送餐的顾客。把餐馆两边的居民分为左右(l、r)两个部分,并按距离由近到远排好序。dp[l][r]原创 2020-11-18 18:05:29 · 98 阅读 · 0 评论 -
区间dp -- Multiplication Puzzle POJ - 1651
Multiplication Puzzle POJ - 1651 题意:给你 n(2 < n <= 100)个数,求把这n个数删到只剩首尾两个数的代价和,删掉一个数的代价是这个数和与它相邻的左右两个数的乘积。例如:如果有6个数10 、1、50 、20、 5,删数的顺序为 1、20、50,则代价和为:10 * 1 * 50 + 50 * 20 * 5 + 10 * 50 * 5 = 500 + 5000 + 2500 = 8000。如果删数的顺序为 50、20、1,则代价和为:1 *原创 2020-11-14 16:29:06 · 145 阅读 · 0 评论 -
数位dp(平方和问题) -- 吉哥系列故事——恨7不成妻 HDU - 4507
吉哥系列故事——恨7不成妻 HDU - 4507 题意:有T次询问,每次询问给两个数 l、r(1 <= l <= r <= 1e18),求在 l、r 间所有与7无关数的平方和。与7无关数定义: 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关,都不符合则是与7无关数 1、整数中某一位是7; 2、整数的每一位加起来的和是7的整数倍; 3、这个整数是7的整数倍;思路:dp[pos][sum1][sum2],一维表示一个数从左至右第pos个数位,二维su原创 2020-11-10 22:01:26 · 122 阅读 · 0 评论 -
数位dp -- Balanced Numbers SPOJ - BALNUM
Balanced Numbers SPOJ - BALNUM 题意:有T次询问,每次询问给你两个数l、r(1 <= l <= r <= 1e19),问你l、r间有多少个平衡数。平衡数定义:0、2、4、6、8等偶数出现奇数次,1、3、5、7、9等奇数出现偶数次,0 ~ 9的中有的数也可以不出现,符合这样的条件称为平衡数。思路:dp[pos][sum],一维表示从左至右第pos数位,二维sum表示0 ~ 9出现情况的状态压缩。如何状压0 ~ 9的出现奇偶情况,用数位长度为10三进原创 2020-11-10 15:43:06 · 85 阅读 · 0 评论 -
数位dp入门 -- B-number HDU - 3652
B-number HDU - 3652题意:多次询问,每次询问给你一个数n(1 <= n <= 1e9),问你n内有多少个数含有‘13’且能被13整除。思路:dp[pos][sum][ind]。一维表示数从左至右的第pos位。二维sum表示前pos位前缀数模13的值。三维ind,ind = 0表示前pos位前缀数中没有出现’13’、且pos - 1位的数不为1,ind = 1表示前pos位前缀数中没有出现’13’、且pos - 1位的数为1,ind = 2表示前pos位前缀数中出现了原创 2020-11-09 01:33:41 · 102 阅读 · 0 评论 -
数位dp入门 -- Balanced Number HDU - 3709
Balanced Number HDU - 3709 题意:给你T次询问,每次去询问两个数l, r(0 <= l <= r <= 1e18),问你l,r间有多少个平衡数,平衡数定义:平衡的数字必须与某些数字的支点保持平衡。例如,4139是一个枢轴固定为3的平衡数。左侧部分和右侧部分的扭矩分别为4 * 2 + 1 * 1 = 9和9 * 1 = 9。思路:dp[pos][sum], 一维表示一个数从左到右第pos位,二维sum表示支点左右相加后的平衡值,支点左边的数设为正,右边原创 2020-11-09 00:24:31 · 125 阅读 · 0 评论 -
数位dp -- Beautiful numbers CodeForces - 55D
Beautiful numbers CodeForces - 55D题意:每次问你在[l, r]的区间类有多少美丽数,我们将定义美丽数是一个可以被自己每一位上非0的数整除。l, r的范围是9 * 1e18级。思路:数位dp思路一个的数由0 ~ 9组成,一个数可以同时被1 ~ 9中的若干数整除,等同于该数可以被它们的最小公倍数整除。dp[pos][sum][lcm],一维pos表示从高位到低位的第几个数,二维sum表示一个到前pos位的前缀数,三维lcm表示前pos位的每一位数的最小公原创 2020-11-06 21:18:17 · 89 阅读 · 0 评论 -
简单dp -- Common Subsequence POJ - 1458
Common Subsequence POJ - 1458 题意:给你s, t两个字符串,求出两个字符串的最长公共子串,子串的原串字符按原串顺序组成的。思路:dp[i][j]记录s串第i个字符匹配到t串第j个字符的最长公共子串长度,把s串的字符与t串的字符挨个比较,若s[i] == t[j], 则此时匹配的最长字串为dp[i][j] = dp[i - 1][j - 1] + 1,否则dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])。code:#inclu原创 2020-10-22 23:57:19 · 181 阅读 · 0 评论 -
简单dp(使序列单调成本最值求解)-- Making the Grade POJ - 3666
Making the Grade POJ - 3666题意:给你一个个数为n的序列,序列的每个数可以随意加减,其加减值算作成本,问你把序列变成不严格的单调上升序列的最小成本。思路:先对原序列a离散化,即排序去重存在数组b中,dp[i][j]表示把序列a的前i个数的最大值(即a[i])变成b[j]所积累的总成本,dp转移式为:dp[i][j] = min(dp[i][j], mi + abs(a[i] - b[j])),其中mi = min(mi, dp[i - 1][1 ~ j])。为什么只原创 2020-10-25 11:30:21 · 149 阅读 · 0 评论 -
对称矩阵dp -- Phalanx HDU - 2859
Phalanx HDU - 2859题意:给你一个n * n 的矩阵。矩阵由大小写字母组成,找关于左下角到右上角对角线对称的矩形,求能找到的最大的矩形大小。思路:观察矩形对称的特点,dp[i][j]存以(i, j)为右下角的最大对称矩形大小,从左上到右下递推,转移式为 dp[i][j] = k,显然k不会超过 dp[i - 1][j + 1] + 1,code:#include<iostream>#include<cstdio>#include<cstdlib&原创 2020-10-24 15:30:41 · 155 阅读 · 0 评论 -
简单记忆化 -- FatMouse and Cheese HDU - 1078
FatMouse and Cheese HDU - 1078题意:给你一张 n * n 的图,每个点都有一个权值,老鼠从矩阵原创 2020-10-24 13:36:34 · 131 阅读 · 0 评论 -
简单dp -- Treats for the Cows POJ - 3186
Treats for the Cows POJ - 3186题意:给你一列数,有n个,可以从两头取出,第i个数对答案的贡献为a[i] * cot,cot是a[i]第cot次取到,答案为每个数的贡献和,求采取最佳的取数策略得到答案最大值。思路:dp[i][j]表示从数列左端取到数a[i]、右端取到a[j]时积累的最大贡献。状态转移式为:dp[i][j] = max(dp[i - 1][j] + (i + (n - j + 1)) * a[i], dp[i][j - 1] + (i + (n -原创 2020-10-24 00:21:52 · 139 阅读 · 0 评论 -
简单dp -- Help Jimmy POJ - 1661
Help Jimmy POJ - 1661题意:Jimmy从最高点(x, y)跳到地面,但高度不能超过MAX,否者jimmy会跳死,所以jimmy可能要借助给出的n与地面平行的平面,平面的高度为h,水平范围从x1到x2。jimmy在水平和竖直方向的运动速度都是1m/s。求jimmy跳到地面的最小时间。思路:把最高点(x, y)视为一个(x1, x2, h) = (x, x, y)的平面,按高度从低到高给这n + 1个平面排序,dp[i][0]表示从下面平跳到i平面左端点的最少花费时间,dp[i][1原创 2020-10-23 16:10:05 · 84 阅读 · 0 评论 -
01背包 -- Jury Compromise POJ - 1015
Jury Compromise POJ - 1015 题意:从n个人里选m个人,每个人都有p,d两个属性,要求m个人的p[i] - d[i]之和最小,在此基础上p[i] + d[i]之和最大思路转换为01背包问题,首先将p-d差值转换为“体积”,p+d 转化为“价值”。设dp[i][j][k] :表示从前i个人中选了j个人他们的差值为k。 里面就保存了最大价值,即p+d的和。那么每次有2种转移:第一种: 不选第i个人,那么从 dp[i - 1][j][k] 转移来第二种: 选第i个人人,那么原创 2020-10-22 19:55:49 · 94 阅读 · 0 评论 -
最长上升子序列 -- 最少拦截系统 HDU - 1257
最少拦截系统 HDU - 1257题意:给你一个数列,问你最少有几个单调递减序列(反过来就是单调递增)。思路:单调递减的特点就是后面的数小于等于前面的数,那么我们只要找到一个严格单调上升数列,并统计上升数列的元素个数就行了,这些元素就是单调递减数列的第一个元素。code:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath原创 2020-10-21 14:13:51 · 96 阅读 · 0 评论 -
状压dp -- Doing Homework HDU - 1074
Doing Homework HDU - 1074 题意:有n门课程的作业,每门作业都有截止时间和做作业花费时间,当到截至时间该作业还没做完时会扣除延期时间数量的分数,问按怎样的顺序来做扣除的总分数最短,输出最短时间,完成作业的顺序(按字典序输出)。思路:状态压缩作业的完成情况,二进制位上的1表示对应作业完成,共有(1 << n)- 1种作业状态,从1到 (1 << n)- 1dp过去,状态转移式为:p[i].dp = min( p[i].dp, p[i ^ (1 <原创 2020-10-19 22:05:04 · 82 阅读 · 0 评论 -
状压dp -- A 收集纸片
A 收集纸片题意:要求从一个初始位置开始,经过所有的纸片,最终再回到初始坐标,求走过的最短距离。思路:状压dp,每个纸片不重不漏地恰好经过一次,很容易想到旅行商问题,即TSP问题(Traveling Salesman Problem)(每个城市只能拜访一次,而且最后要回到原来出发的城市。),这里f [i] [j] 表示经过i表示的路径从j点出来的最短距离。期间路径经过的点压缩表示在i中。code:#include<bits/stdc++.h>using namespace st.原创 2020-05-20 15:23:18 · 164 阅读 · 0 评论 -
数位dp & 记忆化深度优先搜索
2019暑期集训第二次校赛-A.CCSU题目描述给一个26进制数n,a,b,c,…,z 分别代表十进制的0, 1, 2,…,25,且这个26进制数同样不含前缀0,比如aab非法,定义好的26进制数:数字中包含ccsu,比如bccsua是好的,但是ccasu是不好的,现在给你一个26进制数n,让你求 a 到 n 一共有多少个好的26进制数(答案对1e9+7取模)输入描述:输入一个26进制数n...原创 2019-08-20 21:16:29 · 166 阅读 · 0 评论 -
数位dp模板
//http://acm.hdu.edu.cn/showproblem.php?pid=2089#include<bits/stdc++.h>using namespace std;int d[20][2][2], a[20];int dfs(int pos, int sta, int limit) { // sta为1表示前面填了6 if (!pos) ...原创 2019-08-13 01:00:35 · 112 阅读 · 0 评论 -
dp&卡特兰数&记忆化搜索-P1044 栈
P1044 栈递归思路本题的描述十分简单。n个数依次进栈,可随机出栈。求有几种可能。dfs可以解,但是递推仿佛好像如同看上去貌似更简单一些。解释一下原理:建立数组f。f[i]表示i个数的全部可能性。f[0] = 1, f[1] = 1; //当然只有一个设 x 为当前出栈序列的最后一个,则x有n种取值由于x是最后一个出栈的,所以可以将已经出栈的数分成两部分1、比x小2、比x大...原创 2019-10-17 22:44:25 · 181 阅读 · 0 评论 -
01背包的搜索原理(还是懵逼)
P1802 5倍经验日背包还是理解不到位呀QWQ思路简单的01背包,不过实在01背包的基础上加了一个小小的变化,也就是不用药打也是要算在重量内。所以可得动态转移方程:f[j]=max(f[j]+lost[i],f[j-use[i]]+win[i]) (当j>=use[i]时)f[j]=f[j]+lost[i] (当j<use[i]时)//重点注意:由于有时取不到赢的价值...原创 2019-10-15 22:03:08 · 154 阅读 · 0 评论 -
线性dp(路径压缩)-P1052 过河
P1052 过河直接暴力dp一定会爆,要状态压缩一下,虽然L到了10^9,但是石子少啊,只100,所以说在此之间会有很多空挡,会造成很多冗杂的状态。所以把中间空着的状态进行压缩。如何压缩?首先,1≤S≤T≤10。那我们把石子间的空隙%lcd(1,2,3,4,5,6,7,8,9,10),也就是 % 2520。(lcd为最小公倍数)为啥这样做?无论青蛙能跳多少,他一定能到达2520处,如果252...原创 2019-10-13 22:35:14 · 123 阅读 · 0 评论 -
区间dp&记忆化搜索-P1063 能量项链
P1063 能量项链https://www.luogu.org/problem/P1063另外推荐一下同类型P1880 石子归并思路经典区间dp,题目要求的是整个区间的最优解,所以根据DPDP的最优性原理,我们可以从最小的可求最优解的区间入手(即n=2n=2,因为只有一颗珠子时无法合并),每次尝试把它分成两个不同的小区间,从中取最优的方案。设f [ i ][ j ] ,f[ i ][ j...原创 2019-10-13 11:54:41 · 175 阅读 · 0 评论 -
dp-二分查找dp判断
https://codeforces.com/gym/102279/problem/C题意扫雷,在长度为 lenght 的街道上有 n 个地雷,再输入每个地雷在街道上的位置,1<=lenght<=1e9,1<=n<=2000;现有排雷范围为w,2w的一次性排雷装置,1<=w,分别由p、q个。现问w的值至少为多大。思路先二分找w,对于每次二分的值写一个函数进行...原创 2019-09-05 07:57:47 · 613 阅读 · 0 评论 -
dp-2019暑期培训第1次校赛-D.9012
2019暑期培训第1次校赛-D.9012题目描述有一个n * n的地图,每个格子(i, j)都有权值 ,现在你在(1, 1)起点位置, 每次你可以往下走或者往右走,每走到一个格子就会获得该格子的权值(起点的也算),问你走到终点(n, n)有多少条不同的路径,其路径上的权值总和刚好为2019。答案对1e9 + 7取模输入描述:第一行输入一个n(1 <= n <= 100)接下来...原创 2019-08-08 10:30:41 · 179 阅读 · 0 评论 -
解决组合类型的dp
2019暑期牛客多校第5场-G.subsequence 1题目描述You are given two strings s and t composed by digits (characters ‘0’ \sim∼ ‘9’). The length of s is n and the length of t is m. The first character of both s and t a...原创 2019-08-02 16:30:19 · 159 阅读 · 0 评论 -
dp-cf-F-风王之瞳
dp-cf-F-风王之瞳题干:F. 风王之瞳time limit per test1.0 smemory limit per test256 MBinputstandard inputoutputstandard output如果莫名流泪,也许是失去了什么美好的回忆。伪装成人类少女夏弥的龙王耶梦加得曾在暗中默默观察了这个名叫楚子航的男孩很多年。后来,她以学妹的身份正面出现在楚子航身...原创 2019-07-11 14:05:34 · 357 阅读 · 0 评论