
dp
文章平均质量分 66
动态规划
lushanlushan0026
退役acmer,准研究生
展开
-
子序列dp问题
问题:给出一个长度为n(1≤n≤106)n \quad(1 \leq n \leq 10^{6})n(1≤n≤106)的字符串,你需要求出该字符串有多少个不同的子序列。子序列的问题乍一看和字串的问题很相似,可能要用到后缀数组等高级数据结构。仔细想想其实没有必要的,一个O(n)O(n)O(n)的dpdpdp就可以解决。对于给出的字符串A[1],A[2],...A[n]A[1],A[2],...A[n]A[1],A[2],...A[n],我们用dp[i]dp[i]dp[i]表示以字符A[i]A[i]A[.原创 2021-08-28 15:07:06 · 275 阅读 · 0 评论 -
CF1156D 0-1-Tree 换根dp or 并查集
这题好像做法挺多的 还有个并查集的方法也非常好理解 可以看博客:CF1156D 0-1-Tree我的做法是换根dp 由题目可知 路径是有向的 也就是说 如果 u->v满足条件 且v->u满足条件 那么我们都要算进去 那我们先算以1为出发点 可以得到的答案数 然后再进行换根 把这些答案都加起来就是最终答案了 考虑以u为出发点 dp[u][0] 表示与子节点连边为0的方案数 dp[u][1]同理那么状态转移就是 我们用这个式子算出以1为出发点的...原创 2020-07-17 16:43:31 · 405 阅读 · 0 评论 -
牛客 吉林大学ACM集训队选拔赛 (重现赛)A 数位dp
被榜骗了 *** h题不是有手就会吗 怎么就那么点人过啊不过我还是补a 数位dp 很久很久以前写过 不要62 不过忘得干干净净了这题应该是数位dp里面最简单的那种吧链接:https://ac.nowcoder.com/acm/contest/5944/A来源:牛客网题目描述One day, Ks raised a question in this contest.How many times the digit 7\texttt{7}7 appears in the in...原创 2020-06-14 16:44:35 · 336 阅读 · 0 评论 -
CERC2014 gym 100543L
这题完全没往dp上面想 害 有时候贪心和dp 还是很难分的开 该dp的写贪心大概率是只过样例的 一个比较好的方法是 看数据范围 但是这个也不完全准确 至于一些更进阶的方法 我也不晓得啊 有时候想个贪心也不知道对不对 想错误样例也想不到位 害 wo太难了这题对于每个区间找出d的最大值 然后枚举这个最大值对应的l和r作为决策点就行了#include<bits/stdc...原创 2020-05-05 10:03:12 · 204 阅读 · 0 评论 -
HDU 5791 TWO dp求公共子序列的个数
类似于求最长公共子序列 要稍微变形表示前缀子串A[1~i]和B[1~j]的公共子序列的个数显然应该由转移过来我们把分为两部分,一部分为公共部分,另一部分为非公共部分显然公共部分是我们只要减去公共部分就行我们考虑一下对于公共部分 我们可以在后面加上一个A[ i ]让它合理 非公共部分我们显然要计入答案 然后还会多出一个就是A[ i ]这个单独的数这样说可...原创 2020-04-27 14:47:00 · 411 阅读 · 0 评论 -
cf #637 (Div. 2) D. Nastya and Scoreboard
这题看着就是一道dp,不过始终没找到什么合适的方法(太菜了) 一开始想着用string类型记录所有状态然后强行比较大小(然后发现string的比较和加运算都是o(n)的) 也就是搞了个N^3的算法 肯定gg了赛后看了一下别人交的代码 感觉还是思维太差了(当时始终想不到怎么记录dp的路径)首先我们要从低位向高位dp,为啥呢,因为在比较大小的时候是从高位开始逐一的比较,如果从低位可以推到...原创 2020-04-24 13:31:49 · 695 阅读 · 0 评论 -
poj 1185 状压dp经典
显然的我们把放置炮兵部队的位置用1表示,不放的位置用0表示,每一行用一个二进制数就可以表示放置情况。这些放置要满足如下条件:(n表示行数 m表示列数)每一行的炮台之间距离大于2 所有我们要预处理出所有满足1之间的距离大于2的m位的二进制数 即一个二进制数满足(i&(i>>1))!=0 && (i&(i>>2))!=0 表示当前行状...原创 2020-04-22 21:54:06 · 144 阅读 · 0 评论 -
Mondriaan's+Dream POJ 2411 状压dp
题目链接:poj 2411题目大意:对于一个n*m的矩阵,可以放1*2的牌,横着放或者竖着放,问有多少种放的方法。我们考虑每一行是把牌横着放还是竖着放,显然竖着放的时候会影响到下一行,所以我们把竖着放的位置用二进制的1表示,并且是表示这个位置是竖着放的牌的上半部分(可能有些绕 仔细理解一下)那么对于一行的状态我们用一个二进制的数如上面的说法表示,如何转移呢,要满足一下两点:上一...原创 2020-04-22 10:44:40 · 120 阅读 · 0 评论 -
HDU 5542 树状数组优化dp
这是个计数的问题,我们考虑dp方程表示长度为 i ,以 aj 结尾的严格上升子序列的个数显然: 其中 k < j && a[ k ] < a[ j ]朴素代码:scanf("%d%d",&n,&m); for(int i = 1; i <= n; i++) scanf("%d",&a[i]); mems...原创 2020-04-19 14:48:22 · 328 阅读 · 0 评论 -
poj 2376 线段树优化dp
题意:选出最少数量的线段 覆盖整个区间我们先考虑如何dp,先把所有线段按照 排序,为什么要按排序 因为它代表了一条线段能覆盖到的最右区间,这个值会对后面的dp转移有影响,相反不可以。 然后我们遍历所有线段,用表示覆盖区间 1 到 ri 处用的最少的线段数量 考虑何转移:显然我们要搜查区间最小值,并且需要支持更新,那么我们就要用到线段树来优化这个过程初始化其他为i...原创 2020-04-19 12:34:36 · 335 阅读 · 0 评论 -
CH 0103 最短Hamilton路径 状压dp入门
题目链接:CH01030103 最短Hamilton路径0x00「基本算法」例题描述给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。输入格式第一行一个整数n。接下来n行每行n个整数,其中第i行第j个整数表示点i到j的...原创 2020-04-19 09:45:15 · 350 阅读 · 0 评论 -
poj 1742 Coins 多重背包的可行性问题+优化讨论
是原创 2020-04-17 22:44:13 · 880 阅读 · 0 评论 -
HDU - 2859 记忆化搜索
比较简单的记忆化搜索 记忆化搜索可以说是动态规划的递归实现 但是这题要是用动态规划去做(肯定可以的) 不知道该怎么写 想法用记忆化搜索的话可以有个清晰的思路表示当前坐标(i,j)可以获得的最大值 当我们在走到这个点的时候直接返回即可然后进入搜索的状态枚举阶段 向四个方向分别枚举k步 得到当前坐标的最大值 用dp[i][j]记录下来#include<cstdio&g...原创 2020-04-17 12:07:35 · 194 阅读 · 0 评论 -
E. Kaavi and Magic Spell 区间dp
个人觉得dp的边界条件应该是由状态转移方程所确定的 一般先确定状态转移方程 在通过合理性去判断边界条件这个题题意很好理解 给你两个串 s和t 用s去构建一个新串 每次按顺序取出s中的一个字母 可以加在新串的开头 或者结尾 问有多少种方法让新串的前缀是t如果要让新串的前缀是t串的话 那么s显然要通过某种方式和t串进行一个匹配 通过题意知道s串在取字母的时候可以放新串的前面或者后面 那我...原创 2020-04-17 09:41:47 · 244 阅读 · 0 评论 -
POJ 3186 Treats+for+the+Cows 简单dp或者区间dp
题目链接:POJ - 3186FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for giving vast amounts of milk. FJ sells one treat per day and wants to maximize the money he recei...原创 2020-04-17 08:01:31 · 155 阅读 · 0 评论 -
poj 3585 二次扫描+换根dp
题目链接:poj 3585这题应该算换根dp的入门题吧首先我们进行第一次扫描 可以任选一个根x 算出以x为源点的最大流量是多少设表示以x为根的子树中,把x作为源点 从x流向子树的最大流量是多少 我们用表示一个点的入度 有如下dp方程第二次扫描时我们先把根节点的答案计入(因为第一次扫描已经处理好了) 当我们要遍历一个子节点的时候(设为y)我们要进行换根操作 如...原创 2020-04-16 12:16:11 · 360 阅读 · 0 评论 -
CH 5401 没有上司的舞会 树形dp入门
表示第个人有没有去舞会 如果去了 flag=1,否则flag=0显然如果去了那么他的下属必定不会去如果没去那么他的下属去不去都行,我们要选一个最大值我们先找出树根rt 最终我们需要的答案是#include<bits/stdc++.h>using namespace std;const int N = 6e3+100;int cur,h[N],to...原创 2020-04-15 15:11:14 · 171 阅读 · 0 评论 -
lightoj 1442 区间dp
表示区间l到r内最少的衣服数显然 当a[l]==a[r]时 在l处穿的衣服可以用到r处 所以不需要增加然后我们在枚举断点k做出决策 选最小值即可(大区间由小区间合并而来 选出最小的)#include<bits/stdc++.h>using namespace std;int dp[102][102],a[102];const int INF = 1e9;i...原创 2020-04-14 11:35:24 · 198 阅读 · 0 评论 -
区间dp经典题 HDU 4632 回文子序列计数
HDU 4632题意:统计所有回文子序列的个数这题不同于普通的区间dp 但是也大同小异 省略了一个决策的过程 简单的计数就是 但是这个计数方法也需要一定的思维区间l到区间r的回文子序列个数当我们需要求得的个数时和显然是可以用来转移的 但是我们发现 他们之间有一部分重叠 那就是根据容斥原理 我们需要把这一部分减去初步鉴定转移方程是但是我们发现答案少了一些...原创 2020-04-13 21:21:13 · 561 阅读 · 1 评论 -
区间dp经典之凸多边形的三角剖分
题意 题目链接找不着了 不知道去哪了Problem Description给定一个具有N(N<=50)个顶点(从1到N编号)的凸多边形,每个顶点的权值已知。问如何把这个凸多边形划分成N-2个互不相交的三角形,使得这些三角形顶点的权值的乘积之和最小。Input第一行为顶点数N,第二行为N个顶点(从1到N)的权值。Output乘积之和的最小值。题目保证结果在int范围内...原创 2020-04-12 17:07:42 · 315 阅读 · 0 评论 -
区间dp经典 括号匹配两题 poj2955 和 poj1141
两个题的链接:括号匹配1括号匹配2首先我们看第一题 是很简单的区间dp 问一个符号串 最大的完美匹配数是多少表示区间l到r最大的完美匹配数 根据区间dp的性质 是由较小的区间向较大的区间转移根据题意一开始的元区间即一个符号不构成完美匹配当l和r构成一对匹配的时候 显然有或者的最大值 是由某两个子区间合并而来 这一部分类似区间dp的套路暴力枚举断电 ...原创 2020-04-12 15:42:41 · 149 阅读 · 0 评论 -
CH 5103 传纸条 动态规划
题目链接:CH 5103这题和lyd书上表述的不太一样,这个题强调了两条路径不能走相同的地方我们用表示走了i步 第一条路径位于x1行 第二条路径位于x2行那么 我们可以得到 x1+y1=x2+y2=i+2 通过坐标我们把走到相同位置的路径丢弃 不再向后转移 但是要注意的是当我们走到终点时 会把这个点计算两边 我们需要减去一次#include<bits/...原创 2020-04-12 15:17:25 · 182 阅读 · 0 评论 -
区间dp入门 石子合并 (线形和环形)
#include<bits/stdc++.h>using namespace std;const int N = 1e3+10;typedef long long ll;ll dp[N][N],a[N],sum[N];int main(){ int n; scanf("%d",&n); for(int i = 1; i <= n; i++) scanf(...原创 2020-04-11 16:55:28 · 130 阅读 · 0 评论 -
Codeforces 1316 E. Team Building 状压dp+贪心
题目链接题意:总共有n个人,每个人可以当做观众或者球员,每个位置只有一个球员,给定每个人当观众的价值和每个人在每个位置的价值。其中共有p(p<=7)个球员和k个观众,求出怎么安排使得总价值最大。首先得贪心选择 将观众的价值从大到小排序 这样观众的选择可以保证最优表示正在选第i个人 并且确定第i个人后球员的选择状态用二进制压缩的j来表示那么如果我们不选第i个人...原创 2020-04-11 14:43:04 · 137 阅读 · 0 评论 -
CH 5102 动态规划 维度最小化
本题思路来源于 李煜东《算法竞赛进阶指南》直接的状态就是记录已经完成的请求数量 以及三个服务员的位置表示已经完成的任务数,x,y,z分别表示三个服务员的位置 这样的话 时间和空间的复杂度 就是 1000*200^3 显然无法承受那我们能不能缩小表示一个状态所用的维度呢 我们知道当第个任务完成后 肯定会有一个人在这个位置 那我们其实只要维护两个人的位置 另一个人肯定在...原创 2020-04-08 17:00:19 · 223 阅读 · 0 评论 -
完全背包 包含部分例题
题目链接:疯狂采药题目都比较裸 主要是了解一下背包 的问题 先前我们讨论了01背包问题 :01背包 hdu 2602完全背包和01背包很像 关键是 每个物品可以取无限次 没有只能取一次这个限制了那么我们很容易想出 一个转移方程意思是对于一个体积我们可以放这个物品直到它放不进 从这些放的方法中找一个最大值去转移 这样的话显然复杂度比较高我们又想...原创 2020-04-07 12:02:46 · 246 阅读 · 0 评论 -
01背包问题 包含部分例题
作为ds选手(数据结构也很菜) 最近开始回顾dp了 从最简单的01背包 开始 感觉dp比较锻炼思维 而我思维很烂01背包 dp[i][j]表示 第i个物品 我们选出了体积为j的最大value 然后转移一下就ok了dp[i][j] = dp[i-1][j] 不选第i个dp[i][j] = dp[i-1][j-vol[i]]+val[i] 选第i个#include<...原创 2020-04-07 10:49:36 · 453 阅读 · 0 评论 -
CH5101 LCIS 简单dp
题目及思路来源:李煜东 《算法竞赛进阶指南》题目链接:LCIS如何优化dp是一个值得思考的问题 dp与搜索的区别在于 dp避免了大多的重复运算 以此来达到高效 (记忆化搜索) 不过有时候写的dp也会 算很多重复的 这时候要适当优化 比如这题 一开始 写一个n^3的dp#include<bits/stdc++.h>using namespace std;t...原创 2020-04-06 18:29:50 · 146 阅读 · 0 评论 -
poj 2279 dp(防MLE) 或 数论(杨氏矩阵+勾长公式)
题目链接:poj 2279这个题目 有两种做法 dp 或者是 杨氏矩阵+勾长公式首先是dp做法(参考lyd的书) 这有个小技巧 就是 31的5次方会爆内存 所以我们得开个可变的数组 就是 先把那5维的大小输入 在创建数组 这样可以节省很多空间 另外像这种可变数组是不能全局声明的#include<cstdio>#include<cstring>...原创 2020-04-06 12:27:27 · 343 阅读 · 0 评论 -
CodeForces - 1077F2 单调队列优化dp
做F2之前我们先想想F1 怎么做 做了这两题可以在想题的时候更好地梳理自己的思路 以得到优化算法的方法因为F1数据小 可以n^3暴力 dp[i][j] 表示我们选到了第i个物品并且选了第i个以后我们有j个物品 以下是代码#include<bits/stdc++.h>using namespace std;const int N = 5e3+100;typed...原创 2020-04-02 13:23:52 · 520 阅读 · 0 评论