1.AcWing272:最长公共上升子序列(经典DP)
- 题意:就是求解两个字符串的最大上升公共子序列。
- 思路:需要结合最大上升子序列和最长公共自序里啊两个题来进行求解。
- 博客链接:https://blog.csdn.net/weixin_43460224/article/details/101175540
2.hdoj 2084 数塔问题(经典DP)
- 题意:给定一个数塔,求解从顶部走到底部所经过的最大价值。
- 思路:逆推法。每次寻找最优,向上推。
dp[i-1][j]=max(dp[i][j] + dp[i-1][j] , dp[i][j+1] + dp[i-1][j])
3.nyoj 61 传纸条(一)(双线程 DP)
- 题意:在一个矩阵中传纸条,从一个点到另一个点,然后再返回。每一个点都有一个权值,要求来回不能经过同一个点,求解一个来回之后的最大的权值。
- 思路:枚举到当前位置从不同方向来的权值,取最大值,求和。从(1,1)到(n,m),两条线路同时走,且不能有交叉。
- 博客链接:
基础四维求解:https://blog.csdn.net/chenzhenyu123456/article/details/44888227;
优化到三维:https://blog.csdn.net/u012515742/article/details/41478817
4.nyoj 10 skiing (记忆化DP)
- 题意:给定一个矩阵,矩阵的数字为当前位置的高度,求从某一个出发的最长下降的序列。
- 思路:dp[i][j]为从(i,j)走的最大长度,记忆化搜索。
- 博客链接:https://blog.csdn.net/chenzhenyu123456/article/details/50452216
5.Codeforces 602B Approximating a Constant Range (dp + 二分)
- 题意:给定一个由n个元素组成的序列a[],保证相邻元素之间差的绝对值不超过1。问你最长的T序列。
- 思路:
定义dp[i]为以a[i]结尾的最长T序列。用一个结构体存储以下信息:le—序列长度,mx—序列最大元素,mi—序列最小元素。
考虑a[i]的状态,根据a[i] 与 dp[i-1].mi 和 dp[i-1].mx的关系写出不同的状态转移方程。
-
博客链接:https://blog.csdn.net/chenzhenyu123456/article/details/50161749
6.Codeforces 621E Wet Shark and Blocks (矩阵加速dp)
- 题意:有b组数,每组数均有n个且相同。你必须在每组选一个数,组成一个新数sum,使得sum % x == k,问方案数 % (1e9+7)。
- 思路:设置dp[i][j]表示前i个数所组成的数 % x == j的方案数。转移方程为dp[i][(j*10+t)%x] = dp[i-1][j]。使用矩阵加速。
- 博客链接:https://blog.csdn.net/chenzhenyu123456/article/details/50618266
7.动态规划知识原理详解吧
- 从思考问题的角度用动态规划求解问题的方法的方面对动态规划进行了详细的介绍,简单易懂,思想明确。
- 博客链接:https://blog.csdn.net/zw6161080123/article/details/80639932
8.2019年秦皇岛区域赛I题:Invoker(动态规划)
- 题意:三个给出10个规则,三个无序的大写字母与一个大写字母相互对应。给出一个字符串,要求扩展成所有字母对应操作的一个字符串要加入的最少字母数(PS:队伍仅留3个字符,所求结果要加上原字符串的长度)
- 思路:当前状态的最小值加上上一状态的最小值,加最小的增加字符数,三位数组建立一个字符和三个字符不同排列之间的关系。
- 博客链接:https://blog.csdn.net/weixin_43460224/article/details/101623076
9.poj 1185 炮兵阵地 (状压DP)
- 题意:每一个炮兵阵地所炸范围如图,问在一个表格上最多可以放多少个炮兵阵地使其不相互影响。
- 思路:位运算用的很巧妙。用一个二进制数记录第i行每一列的状态,dp[i][j][k]表示第i行为状态j且第i-1行为状态k时能够放置的最大数。状态转移方程为:
dp[i][j][k] = max(dp[i][j][k], dp[i-1][k][t] + num[j])
10.POJ 3311 Hie with the Pie(状压dp)
- 题意:给出n+1(n<=10)个点之间两两的距离,问遍历所有点后回到1号点的最短路径长度。
- 思路:用floyed预处理任意两点之间的最短路,然后从1点出发进行状压dp计算遍历所有点的最小长度,最后再枚举从所有的点到点1与状压dp结果求和的最小值。
- 博客链接:https://blog.csdn.net/chenzhenyu123456/article/details/47138465(略复杂)
https://blog.csdn.net/LSD20164388/article/details/89227693(简单易懂)
11.poj 2411 Mondriaan's Dream (状态压缩dp)
- 题意:给一个n*m(1<=n,m<=11)的棋盘,用1*2的木块放满整个棋盘,求一共有多少种放法。
- 思路:每一行能不能放只与它的上一行的状态有关,用dp[i][state]表示第i行状态为state的放法总数,枚举就可以了。
- 博客链接:https://blog.csdn.net/LSD20164388/article/details/78681172
12.zoj 3537 Cake (凸包 + 区间dp)(最优三角剖分)
- 题意:现在已经给出计算代价的公式,问把多边形切成最多个不相交三角形的最小代价是多少,切多边形时每次只能在顶点和顶点间切,只能切凸多多边形。
- 思路:先判断是否是凸多边形,然后dp。dp[i][j]为从顶点i到顶点j所围成凸多边形的最优解,枚举切点k,状态转移方程为:dp[i][j] = min(dp[i][k] + dp[k][j] + cost[i][k] + cost[k][j]);
- 博客链接:https://blog.csdn.net/chenzhenyu123456/article/details/50386238
13.hdoj 4283 You Are the One (区间dp)
- 题意:比较有代表性的区间dp。有N个人按顺序排成一排上台表演,每个都有一个num[]值,第k个上场的人会有num[]*(k-1)的unhappiness。求最优方案是所有人unhappiness最小。
- 思路:设置dp[i][j]为区间[i, j]的人上台表演最小的unhappy值之和。枚举最后一个上场的人为k,则[i,k)和(k,n]都比k先上场。状态转移方程为:
dp[i][j]= min(代价一:dp[i][k-1] + 代价二:num[k]*(j-i) + 代价三:dp[k+1][j]+(k-i)*sigma(num[l] 注:k+1<=l<=j));
-
博客链接:https://blog.csdn.net/chenzhenyu123456/article/details/50370449
14.nyoj 737 石子合并(一) (经典区间dp)
- 题意: 有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
- 思路:经典区间DP,状态转移方程:dp[i][j] = min(dp[i][j], DFS(i, k) + DFS(k+1, j) + sum[j] - sum[i-1]);
- 博客链接:https://blog.csdn.net/chenzhenyu123456/article/details/50451928
15.51 nod 1022 石子归并 V2(dp决策单调性)
- 题意:N堆石子摆成一个环。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价。计算将N堆石子合并成一堆的最小代价。
- 思路:区间dp,平行四边形优化。
- 博客链接:https://blog.csdn.net/yjf3151731373/article/details/78223086
16.51nod1134 最长递增子序列(基础DP+优化)
- 题意:求最长上升子序列
- 思路:将原数组放入一个有序的数组中,如果大于最大元素则加入数组,否则用lower_bound()查找大于等于他的那个数,并替换掉它
- 博客链接:https://blog.csdn.net/weixin_43460224/article/details/102532818
17.CodeForces - 284D:(记忆化搜索)
- 题意:开始给定x=1,y=0,给定一个序列a[],a[]的第一位为i,不断重复进行两个操作。x+a[x],y+a[x]和x-a[x],y+a[x];直到x<=0,或者x>n;
输出i从2到n的所有y值。 - 思路:记忆化搜索
- 博客链接:https://blog.csdn.net/weixin_43460224/article/details/102597339
18.51nod:1051 最大子矩阵和
- 题意:求最大子矩阵
- 思路:枚举子矩阵的第一行,固定第一行,枚举矩阵的最后一行。每次记录当前子矩阵的列元素的和,压缩状态求最大子段和。
- 博客链接:https://blog.csdn.net/weixin_43460224/article/details/102611671
19.51Nod_1009 数字1的数量(数位dp)
- 题意:从从1到n数位上为1的个数
- 思路:求每一位上的1的个数求和。当前位1的个数可能与它的高位或者低位有关。
- 博客链接:https://www.cnblogs.com/jy02414216/archive/2011/03/09/1977724.html
- https://blog.csdn.net/SongBai1997/article/details/86607070
20.51Nod_1042 数字0-9的数量(数位dp)
- 题意:求两个数之间所有数位上为0~9的数的个数
- 思路:与上一题类似,把求1的方法扩展到求0~9,求前n和中含有的减去前m个含有的0~9的个数
- 博客链接:https://blog.csdn.net/SongBai1997/article/details/86613185
21.poj 3211:Washing Clothes (分组01背包)
- 题意:两个人同时洗衣服,每人只能同时洗一件衣服,且只能同时洗颜色相同的衣服,并且只有一种颜色的衣服洗完了才能洗下一种颜色的衣服,求解洗衣服所用的最小时间。
- 思路:将衣服按照颜色分类,求出洗一种颜色衣服所需要的时间和,以时间和的一般进行0-1背包求解,再用总时间和减去0-1背包求解出的最大值,不断累加和就是最小的洗衣服时间。
- 博客链接:https://blog.csdn.net/weixin_43460224/article/details/102880843
22.poj 2411 Mondriaan's Dream(状态压缩dp)
- 题意:输入n和m表示一个n*m的矩形,用1*2的方块进行覆盖,不能重叠,不能越出矩形边界,问完全覆盖完整个矩形有多少种不同的方案
- 思路:在位置(i, j) 如果我们选择横着贴砖,那么将(i, j), (i, j+1)都填写成1, 如果竖着贴砖,我们将(i,j)填写成0, 将(i+1, j)填写成1.
- 博客链接:https://blog.csdn.net/u014634338/article/details/50015825
23.HDU 4489 The King’s Ups and Downs(组合DP)
- 题意:给定n个不同身高的士兵,要求按照“…高低高低高低高…”的顺序排列,求一共有多少种排列方式。
输入:每行两个数,第一个为第几组编号,第二个为有多少个不同身高的士兵 - 思路:dp[i][0]表示从高到底,dp[i][1]表示从低到高,c[i-1][j]数组表示从前i选出j个。状态转移方程:t=dp[j][0]*dp[i-j-1][1]*c[i-1][j]; dp[i][0]=dp[i][1]=t/2;
- 博客链接:https://blog.csdn.net/zt2650693774/article/details/100934780
- https://blog.csdn.net/weixin_43460224/article/details/102904522
24.POJ 1239 Increasing Sequences【严格递增子序列】
- 题意:给出一串序列,现在要添加逗号作为分隔符,使得序列是递增序列,然后让最后一个数尽量小,第一个数尽量大。
- 思路:两遍DP。第一遍从前往后求解最后一个数字最小的方法;第二次从后往前求解从前往后最大的方案。
- 博客链接:https://blog.csdn.net/Q_1849805767/article/details/102844793
25.HDU4528 小明系列故事——捉迷藏(BFS)
- 题意:在一个矩阵里,"."是路,"X"是墙壁。两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方,看到就是找到了,D和E本身也是一个能遮挡视线的人。求找到D和E的最小时间
- 思路:BFS,设置一个变量flag来表示当前的状态,利用二进制中的或运算,当最后的结果通过或运算变成3的时候,证明已经找到了。预处理之后直接BFS
- 博客链接:https://blog.csdn.net/riba2534/article/details/79666578
26.HDU 4539 郑厂长系列故事――排兵布阵(状态压缩)
- 题意:给定一个n*m的矩阵。每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置,一个士兵不能站在另外一个士兵所能攻击到的位置。
- 思路:状压DP。状态转移方程:dp[i][j][k] = Max(d[i][j][k],dp[i - 1][k][l] + sum[j]);
- 博客链接:https://blog.csdn.net/acm_BaiHuzi/article/details/40866603
27.HDU 4734 :F(x)【数位DP】
- 题意:给定f(x)的定义:
F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1
,Ai是十进制数位,然后给出a,b求区间[0,b]内满足f(i)<=f(a)的i的个数。 - 思路:数位DP板子题。
- 博客链接:https://blog.csdn.net/weixin_43460224/article/details/103245506
28.POJ 3252:Round Numbers【数位DP】
- 题意:一个数的二进制中0的数量要不能少于1的数量。求在两个数l,r范围内符合条件的数的个数。
- 思路:
dp[pos][num]
表示到当前数位pos,0的数量减去1的数量不少于num的方案数。中间某个pos位上num可能为负数(这不一定是非法的,只要最终的num>=0才能判合法)。最小是-32,直接加上32,做0处理。 - 博客链接:https://blog.csdn.net/weixin_43460224/article/details/103246338