![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
没4年
这个作者很懒,什么都没留下…
展开
-
G - Tray Bien 状压dp(轮廓线dp)
G - Tray Bien题意:给你m * 3的矩形范围内,有一些格子是坏掉的,求用11和12来填满这个矩形的方案数。题解:dp[i][s] 代表第i列,状态为s的方案数。用1代表被填,0代表没有被填。dp[i][s]由dp[i-1][t] 转移而来,因为本题固定三行,所以状态总数为8。然后理解如何转移s1 s20 00 11 1设s1为之前状态,s2为现在状态。如果你发现当前状态此位为0,之前的状态此位也为0,那么现在的状态肯定不合法,因为我们需要填满之前的所有格子。s原创 2020-10-20 16:23:21 · 158 阅读 · 0 评论 -
2020-08-31
Permutation Counting题解:设dp方程:dp[i][j]代表1-i的置换满足b数组要求结尾数字为j的方案数。起始 dp[1][1] = 1;将 1 ~ i - 1 中的 j 置换出来到最后一个位置,且将 1 ~ i - 1 个位置中 插入一个数 i . 且依然符合b数组对排列的限制.解决方法:将前 1 ~ i - 1 个数中的 >= j 的数统统 + 1 . 这样使得 i - 1 => i . 空出来一个j.且限制不变。所以转移具体看代码,自己写也能写出来的。有一原创 2020-08-31 18:36:41 · 125 阅读 · 0 评论 -
String Distance DP
String Distance题意:给定a,b两个串,q次询问,你可以有两种操作,每次操作可以对a串或者b串在任意位置添加一个字符,或者删除一个字符。使得al - ar 与 b 串匹配。题解:设dp[i][j],代表b串第i个字符与a串 ( l-r ) 的LCS的长度为j的最短前缀长度。我们需要预处理next[i][j]代表字符j在i+1 - n中最早出现的位置。那么dp[i][j] = min(dp[i][j],dp[i-1][j]) ; dp[i][j] = min(dp[i][j],next[dp原创 2020-07-29 14:30:00 · 155 阅读 · 0 评论 -
sum of digits
G URAL 1658题意:构造一个数x,使得这个数的数位之和等于n,每个数位的平方和等于m,求最小的 x 。题解:设dp[i][j] 代表构造的数的数位之和为n,数位的平方和为j的最短长度。同时用pre[i][j]记录构造的数的首位。#include<iostream>using namespace std;int dp[910][8200];int pre[910][8200];void init(){ for(int i=0;i<=900;i++) f原创 2020-06-28 16:24:49 · 543 阅读 · 0 评论 -
F2. Flying Sort 区间dp
F2. Flying Sort题意:给定n个数,n个数可能有相同的,每次操作只能选择一个数,将它放在这个数组的首位或者尾部,询问你最少需要进行多少次操作能够让这个数组非递减。题解:首先离散化一下,然后定义dp[i]代表全选a[i]的最长子序列的长度,定义子序列:子序列之外的元素都大于等于子序列的尾部或者小于等于子序列的首部。这里讲一下这个题的细节部分:就是你单纯看定义的子序列,你会发现这个子序列最大值和最小值相差1,你一定能想到,但是如果不是相差1,你需要考虑的就是全选首部或者尾部,这就是dp[i]为什原创 2020-06-17 23:47:44 · 119 阅读 · 0 评论 -
线段树维护dp
J - Journey to the “The World’s Start”题解:看了题目思路很清晰,二分价格,然后O(n)dp,但是dp[i] = min(dp[max(1,i-r)]…dp[i-1]) + d[i];所以需要维护一个区间dp的最小值,恰好用线段树就行,最后复杂度为O(nlognlogn)个人觉得我的代码是用线段树写最简短的。#include<bits/stdc++.h>#define ls o*2#define rs o*2+1using namespace s原创 2020-05-19 11:55:33 · 268 阅读 · 1 评论 -
D-景区路线规划 概率dp+dfs
D-景区路线规划题意:从n个景点中任意一个出发,总共游览k分钟,从一个景点到达另一个景点需要花费一定时间,游览该景点需要花费一定时间,到达一个景点有一定的开心值,求开心值的期望。题解:设dp[u][t]代表到达节点u,剩余时间t 的开心值期望。然后对于每个点dfs一遍,代表以这个点为起点,同时最后答案要除n,也是因为这个。#include<bits/stdc++.h>#def...原创 2020-04-08 21:53:11 · 190 阅读 · 0 评论 -
E 牛牛的随机数 数位dp
E 牛牛的随机数题解:思路就是算二进制每个位置的贡献,然后再将每个位置的贡献加起来就是总贡献。关键是数位dp咋写;我看了半天就是唯一想不通的地方就是为啥要lim == 0 时才能记忆化转移,同样才能给dp赋值。因为当lim==1时说明这个位置有限制所以你枚举的那个数位的数字可能就不是1,就可能多加贡献。所以需要没有限制的时候那么你枚举的数位必然可以达到1,所以可以无脑转移。#include...原创 2020-03-05 17:58:51 · 109 阅读 · 0 评论 -
H 施魔法 区间dp
H 施魔法题意:给你n个物品,每个物品有各自的权值,你每次至少选择k个物品作为一组,选择后这一组就会产生max(ai…ak) - min(ai…ak) 的贡献,要求你将n件物品分为x组后,总贡献最小。题解:首先肯定排序,这没有什么好解释的。设dp[i]代表i件物品的最小花费。那么dp[i] = min{ dp[j] + a[i] - a[j+1] } ( 1<= j <= i-...原创 2020-02-09 00:59:33 · 145 阅读 · 0 评论 -
几道字符串dp的题目
统计CCSU题解:dp[1][i]代表到第i个原串字符 ‘c’ 的字符串数量。dp[2][i]代表到第i个原串字符 'cc’的字符串数量。dp[3][i]代表到第i个原串字符 'ccs’的字符串数量。dp[4][i]代表到第i个原串字符 'ccsu’的字符串数量。#include<bits/stdc++.h>#define ll long longusing n...原创 2020-02-05 21:16:07 · 210 阅读 · 0 评论 -
F maki和tree 换根dp
F maki和tree题意:给你一颗树,每个节点被染成黑色和白色中的一种。问你有多少对<u,v>在u到v的路径上只有一个黑色点。题解:正解是并查集,但是我觉得能用换根dp写,现场赛没写出来,但是dp的大致思路是对的,赛后改了改,好久没写了,换根都有细节出错了。但是一眼还是换根dp。最后还是补了这个题。设dp[u][0]代表到节点u一个黑色点都没经过的点对数,dp[u][1]代表到节...原创 2020-02-04 21:11:47 · 198 阅读 · 0 评论 -
C. Famil Door and Brackets DP
C. Famil Door and Brackets题意:给定长度为m的字符串,需要你构造长度为n的字符串,且该字符串括号匹配,你可以在长度为m的字符串前面和后面添加字符串,问你有多少种构造方法。题解:dp[i][j]代表有i个’(’ ,j个‘)’能构造字符串的切括号匹配的字符串数量。一定保证i>=j。dp[i][j] = dp[i-1][j] + dp[i][j-1];那么我们计...原创 2020-02-03 17:21:38 · 198 阅读 · 0 评论 -
D. Magic Numbers 数位dp
D. Magic Numbers题意:明显数位dp,但是关键怎么写。题解:直接看代码,更加清晰。这个dp方程我其实想到了,但是还是不够熟练地写出来。第一维是数位,第二维是mode m 的余数 , 第三维是当前数位限制。排除不合法的方案(continue掉的)。ok函数就是检验b是否是个有效解。因为减答案的时候将b减掉了。#include<bits/stdc++.h>#defi...原创 2020-02-02 14:34:31 · 118 阅读 · 0 评论 -
C. Garland dp
C. Garland好久没发博客了,发个博客证明我活着!!!又是dp,设dp[i][j][k][2],代表填到第i位,有j个奇数,k个偶数,如果是1表示当前填的数是奇数,如果是0表示当前填的数是偶数。那么转移就简单了。如果当前位置能够随意填数,那么我们需要转移两个dp[i][j][k][0] 和 dp[i][j][k][1],dp[i][j][k][0] = min(dp[i-1][...原创 2020-01-19 12:37:52 · 131 阅读 · 0 评论 -
Hackers' Crackdown 状压dp
Hackers’ Crackdown题意:一共有n台电脑,每台电脑有n个服务,每台电脑有它相邻的电脑,我们对于n台电脑后,每台电脑选择一种服务,那么与它相邻的电脑的这种服务都瘫痪,问你最多能使多少种服务瘫痪。题解:看到n只有16,看能不能状压,我们处理一个p[i]也就相当于一个集合,代表第i台电脑能够影响的电脑,cov[i]代表选择了一些集合后,能够影响的服务,最后f[i]代表状态为i是,服务...原创 2019-12-18 17:02:15 · 142 阅读 · 0 评论 -
B.BE, GE or NE dp
B.BE, GE or NE题意:两个人玩游戏,每个人每轮有三个选择a,b,c;如果a=0,那么就不能选a ;同理b,c;选择a,那么在原来的分数上加上a,选择b,那么在原来的分数上减去b;选择c,那么在原来的分数上乘-1;先手想要最后的分数大于等于k;后手想要最后的分数小于等于l。题解:设dp[i][j]代表在第i轮,当前分数为j,如果我们顺序dp,那么就要考虑后效性,就是对于先手当前最大,...原创 2019-12-10 10:58:41 · 79 阅读 · 0 评论 -
D. Mysterious Code kmp+dp
D. Mysterious Code题意:给你三个串c,s,t,求f( c , s ) - f( c , t )最大,定义f( c , s )代表c串中子串为s的个数。题解:设dp[i][j][k]代表在c串中匹配到第i个位置,s串匹配到第j个位置,t串匹配到第k个位置的最大ans。但是在这个dp中有很多不可以到达的状态,那么我们也没必要由此转移。那么我们对于c[i+1]如果不等于 " * ...原创 2019-12-02 16:38:56 · 244 阅读 · 0 评论 -
简单树上操作 换根dp
简单树上操作我发现一个星期不训练,水平下降很多,这道一眼换根dp没看出来,还是太菜了,补题。题意:求多少对(x,y)之间的距离等于树直径。题解:树形dp维护,节点u到达的最远距离和到达最远距离的点的数量。然后换根dp枚举每个点。#include<bits/stdc++.h>#define ll long long#define pi pair<int,ll>...原创 2019-12-01 16:12:35 · 319 阅读 · 0 评论 -
商汤AI园区的n个路口(中等) 树形dp
商汤AI园区的n个路口(中等)题意:有n个点,n-1条边,要求每条边固定一个值为x,与这条边相邻的两个点的权值的gcd不等于x,权值的上限为m,然后问你有多少方案数,使之全成立。题解:设dp[u][i]代表u节点权值为i的方案数,转移就是u节点的子节点v来转移,如果此时m=4,x=2;那么dp[u][2] = dp[v][1]+dp[v][3];我们dp[v][j],j不能取2/4,那么我们需...原创 2019-11-24 12:11:32 · 125 阅读 · 0 评论 -
HDU 6578 Blank 区间dp
题意:构造一个长度为n的子串,要求在m个区间内,在[ li , ri ]保证要有x个不同的数。题解:我们设dp[t][i][j][k],代表{ 0 ,1,2,3 }四个数最后一次出现的位置。且保证( t >= i >= j >= k )。dp[t][i][j][k] += dp[t][i][j][k] ;// 填的数跟第t-1个数一样dp[t][t-1][i][j] += ...原创 2019-11-23 14:24:04 · 141 阅读 · 0 评论 -
D. Modulo Nine 区间Dp
D. Modulo Nine题意:满足m个限制条件,在 [ li , ri ] 中满足 a li * a li+1 * a ri mod 9 = = 0,问你有多少个长度为n的序列满足。题解:首先我们知道,如果区间有一个9,那么就满足,如果区间有两个3/6也是满足的。那么我们把9看成两个3,我们设dp[i][j][k]代表我们dp到第i位,最后满足限制条件的数出现的位置(也可以理解成倒数第一个...原创 2019-11-22 11:22:33 · 129 阅读 · 0 评论 -
E. Another Filling the Grid 计数dp
E. Another Filling the Grid 题意:要求n * n 个方格内,要求每行每列都有1,问你有多少种填法?题解:设dp[i][j]代表前i行,有j列存在数字1的方案数,对于下一个状态dp[i+1][p];我们分为两种情况讨论:if ( j == p ) 那么我们j列中必须要填一个数字1,j列的其他位置随便填,那么方案数位 k^ j - (k-1) ^ j ,剩余n-j...原创 2019-11-21 17:32:25 · 198 阅读 · 0 评论 -
E. Keyboard Purchase 状压dp
E. Keyboard Purchase题意:给你一个长度为n的字符串,其中包含字母表前m种字符,然后’a‘与‘b’之间代价为 | pos a - pos b |,问你如何构造一个长度为m的字符串使得从左到右敲出长度为n的字符串代价最小。题解:我们状态压缩,用二进制来表达状态,如果状态i的第j位为1,代表第j个字符已经被选好了。那么我们可以通过i来转移,i | (1<<j),如果i...原创 2019-11-20 21:31:34 · 151 阅读 · 0 评论 -
I. Misunderstood … Missing 倒序dp
I题题意:一共有n轮,你每次可以选择三种操作,第一种就是攻击怪兽,造成伤害A+ai,第二种就是提高自己的属性,以后每轮攻击力都增加bi,第三种提高攻击力,攻击力增加ci,问你最多能造成的伤害是多少。题解:这题我一看n,想暴力,发现不行,因为你不能确定那几轮操作干嘛,所以只能dp,dp也不是那么容易,首先这题要倒序dp,倒序dp有什么好处呢,就是如果一个题不要考虑前效应就能用,设dp[i][j]...原创 2019-11-19 15:08:47 · 285 阅读 · 0 评论 -
H Pair 数位dp
H Pair题意不多说,题目直接告诉你了。题解:我们求它的反面,我之前做的数位dp都是可以用反面求更简单,我们找出(x&y)<=C和(x^y)>= C,为啥要反面呢???,因为反面可以无脑当pos超过边界时return 1,因为不合法的情况我们continue了,这是对所有的数位dp都是一样的。那我们设dp[pos][sta1][sta2][lim1][lim2],sta1...原创 2019-11-18 22:21:28 · 107 阅读 · 0 评论 -
I-2019 换根dp
I-2019 题意:求从u到v所经过的权值相加%2019==0的对数,要求u>v。题解:首先你要知道怎么求固定根,用树形dp写出,可以仿照这类题的解法,设dp[i][j]代表节点i权值为j%2019的点的个数,然后换根dp。这个换根dp跟我之前写的不完全一样,建议看代码学习一下。#include<bits/stdc++.h>#define pi pair<int,i...原创 2019-11-14 23:22:20 · 158 阅读 · 0 评论 -
E. Equidistant 换根dp
E. Equidistant题意:求树上是否存在一个点,使得m个给定的点到该点的距离相等。题解:我设每个点对应两个状态,一个是最远到达m各给定点的距离,一个是最近到达m个给定点的距离,如果mx[u]==mn[u]说明该点合法。#include<bits/stdc++.h>#define mk make_pair#define pi pair<int,int>us...原创 2019-11-12 14:05:32 · 458 阅读 · 0 评论 -
F. Regular Forestation 树hash+换根dp
F. Regular Forestatio题意:定义一个好的点,选定它为根,它的子树结构都相同,且它的度大于1,找到最大度的那个好的点,并输出它的最大度。题解:典型换根dp,但是如何判断子树结构是否一致,这个时候就需要树hash来判断,注意:当我们hash合并的时候,需要按照子树的hash值的大小来合并,这样才是正确的合并顺序。#include<bits/stdc++.h>#d...原创 2019-11-11 21:43:15 · 179 阅读 · 0 评论 -
The trouble of Xiaoqian 混合背包
The trouble of Xiaoqian题意:给你n个硬币,每个硬币都有自己的面值和数量,要求付给一个人m元,那个人同时也可以找你一些硬币,要求最小的数量的交易硬币数量。(包括你付给他的和他找给你的)题解:典型多重背包,二进制优化,记得设dp[0]=0,其余都是Inf,但是这个不同的是,别人还可以找你硬币,所以你还要用一个完全背包来记录tmp[i]的每个状态,因为别人的硬币数量是无限的,...原创 2019-11-11 17:37:33 · 120 阅读 · 0 评论 -
Miku and Generals 分组背包+二分图染色
Miku and Generals 题意:给n个数,分为两组,使得两组权值之和差最小,n个数中有一些数有冲突。题解:对于每组背包来说,我们用二分图来染色,标明冲突的状态组合,然后分组背包,对每个数的状态进行转移。最后从能达到的状态中找两个差最小的两个状态。#include<bits/stdc++.h>using namespace std;const int maxn = 1...原创 2019-11-11 12:39:21 · 127 阅读 · 0 评论 -
Anniversary party && Computer 树形dp/换根dp
Anniversary party题解:没什么好讲的,设dp[u][0]代表不选这个节点,dp[u][1]代表选这个节点。#include<bits/stdc++.h>using namespace std;const int maxn = 6005;int dp[maxn][2],w[maxn];vector<int>G[maxn];int dfs(int ...原创 2019-11-08 00:16:06 · 113 阅读 · 0 评论 -
Victor and World 状压dp+Floyd
Victor and World题意:求从一号城市出发经过所有城市,然后再返回一号城市所用的燃料最少。题解:我用Floyd处理出任意两个点之间的最短路。然后设状压dp[i][j],代表第i个城市经过城市的状态由j来代表,那么怎么转移呢?具体看代码实现。关键就是三层for,第一层for代表经过城市的所有状态,第二层for代表该状态下最后到达的点的位置,最后一层代表我可以再到达的一个新的点。#...原创 2019-11-05 21:20:38 · 169 阅读 · 0 评论