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)返回状态,如果已经计算则直接返回,否则递归计算
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人