动态规划:
背包问题:
01背包 : 物品只能装一次
完全背包 : 物品可以多次装入
应用: 给定容量n,和m个物品,求是否可以装满,或者装满的最大价值
1. dp[j]=max(dp[j],dp[[j-c[i]]+w[i]); //前i个物品装入容量为j的背包中
dp[n] 表示用m个物品装满背包容量为n的最大价值
2. dp[j] += dp[j-w[i]]; // 装满背包容量为j, 有多少种方法
初始化 dp[i][0]=1
3. dp[j]= min(dp[j],dp[j-w[i]]+1); //装满背包,所需的最少物品个数
例:2022年国赛填空题
将2022拆分成10个互不相同的正整数之和,总共有多少种拆分方法?
这就是一道01背包的问题
线性dp:
最长公共子序列序列
a[i]==b[j] dp[i][j]=dp[i-1][j-1]+1; //相等时,+1
a[i]!=b[j] dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
最长上升子序列 dp[i]=max(dp[j])+1;
编辑距离
a[i]==b[j] dp[i][j]=dp[i-1][j-1];
a[i]!=b[j] dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
//替换 插入 删除
初始化: dp[i][0]=i dp[0][j]=j;<