首页 > 代码库 > dp 感悟
dp 感悟
能且最大最小的问题:
//function
for (int i = 1; i < A.length; i++) {
can[i] = Integer.MAX_VALUE;
for (int j = 0; j <= i; j++) {
if (can[j] != Integer.MAX_VALUE && j + A[j] >= i) {
can[i] = Math.min(can[i], can[j] + 1);
}
}\
数组求和或求和的最大值问题:
//function
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k && j <= i; j++) {
for (int l = 1; l <= target; l++) {
f[i][j][l] = f[i - 1][j][l];
if (l >= A[i - 1]) {
f[i][j][l] += f[i - 1][j - 1][l - A[i - 1]];
}
}
}
}
//function
for (int i = 1; i <= A.length; i++) {
for (int j = 1; j <= m; j++) {
f[i][j] = f[i - 1][j];
if (j >= A[i - 1]) {
f[i][j] = Math.max(f[i - 1][j], f[i - 1][j - A[i - 1]] + V[i - 1]);
}
}
状态: 多为要求值, 方程多为所求值和前一个值和后一个的关系.遍历、比较、遍历+ 比较、遍历 + 状态判断+ 题设要求; 初始化多为边界和起始值的初始化.
Sequence 题要加判断
Function: 与上一个状态之间的关系: 根据要求 求和、求最大值。最小值。状态为true.
数组题和String 题, sub 题sequence 题多为和上一个状态, 遍历上一个(另一个)指针在的位置 + 判断+ (分类), 求结果递推。String题多为多开辟一个空间
Sub题(common题)多为二维, 多为判断当前的元素是否与……相等, 然后(操作当前元素和不操作当前元素) 当前元素在sub里和不在sub里两种递推结果. 当前元素改为…, 或者当前元素时sub的最后一个元素
dp 感悟