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 @ 2022-02-06 13:11  80k  阅读(71)  评论(0)    收藏  举报