题目整理(DP)

1.AcWing272:最长公共上升子序列(经典DP)

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)

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.动态规划知识原理详解吧  

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+优化)

17.CodeForces - 284D:(记忆化搜索)

18.51nod:1051 最大子矩阵和

19.51Nod_1009 数字1的数量(数位dp)

20.51Nod_1042 数字0-9的数量(数位dp)

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)

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】

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
发布了306 篇原创文章 · 获赞 105 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43460224/article/details/101177293