AcWing 算法基础课 动态规划

1、背包问题

  (1)01背包

  每件物品仅用一次 

  可以做空间优化

  dp[j]=max(dp[j],dp[j-v[i]]+w[i]);   

  0,1背包状态均是从前一循环的状态转移

  注意如果不使用空间优化时,要对小于当前重量的dp位置进行赋值(为上一轮dp的值)!!

  

  (2)完全背包

  每件物品可以用无限次

  dp[j]=max(dp[j],dp[j-v[i]]+w[i]);

  

  完全背包的状态可以从当前循环的状态转移,进行优化

  

 

 

 

 

 

  (3)多重背包

  每件物品有不同的数量限制

  可以对物品的数量限制进行拆分(1~2^k+c),从而转化为01背包问题

  

  也可以用单调队列进行优化(B站,背包9讲)

  (4)分组背包

  组内仅选一件物品  

  与01背包和完全背包相似,

  dp时枚举第i组而不是第i个物品,

  每组中再对组内物品进行枚举。

2、线性DP

  (1)最长上升子序列

  

   优化:

  AcWing 896. 最长上升子序列 II

  记录不同长度的上升子序列的最小的结尾,利用贪心思想,二分查找当前数应该加入哪个子序列后面,更新被加入的结尾和最长子序列长度。

  (2)最长公共子序列

  

 

  

  dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
  if(A[i-1]==B[j-1])
    dp[i][j]=max(dp[i-1][j-1]+1,dp[i][j]);

3、区间DP

  AcWing 282. 石子合并

  

 

  可以用前缀和记录区间和简化计算,状态以合并的分隔位置进行区分,注意枚举顺序。 

4、计数类DP

  整数划分:可以看做完全背包问题

5、数位统计DP

  计算某个数字在[a,b]范围内出现的次数,可以计算[1,b]-[1,a-1],利用类似前缀和的思想求出。

  又count(n)可以用每一位出现的次数求和

  

 

 6、状态压缩DP

  利用二进制表示状态,例如点或者位置是否已经被选择

7、树型DP

  AcWing 285. 没有上司的舞会

  

 

   

 

 

8、记忆化搜索

  DP的递归形式叫记忆化搜索

  dp[i][j]记录状态,DP(i,j)返回状态,如果已经计算则直接返回,否则递归计算

 

posted @   80k  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示