53. Maximum Subarray

f[i] 表示 所有 以第i个元素 结尾的子段 的最大值, 然后分两种情况 1. i前面没有元素( 0 ); 2.i前面有元素(以i - 1结尾的字段的最大值 f[i - 1])
1 | class Solution { |
进一步思考, 发现 f[i] = max(f[i - 1], 0) + nums[i] 只用到了 f[i - 1] 的值
120. Triangle
1 |
63. Unique Paths II
1.状态表示f[i, j] 集合: 所有从起点走到(i, j)的路径
属性: 数量
2.状态计算:
- 最后一步往下走: 从 f[i - 1, j] 到 f[i, j]
- 最后一步往右走: 从 f[i, j - 1] 到 f[i, j]
那么 走到 (i, j) 的路径总数量 f[i, j] = f[i- 1, j] + f[i, j - 1]
这里要特判一下, 第一列(没有向右走的)和第一行 (没有向左走的)
1 | int solve (vector<vector<int>>& g) { |
91. Decode Ways
198. House Robber
状态表示: 集合 :f[i] 是以i结尾的数据段的
属性 : max
状态计算: 最后一个元素有选或不选两种情况, f[i] = max(f[i - 2] + nums[i], f[i - 1])
1 | class Solution { |
优化
1 | class Solution { |
300. Longest Increasing Subsequence
以倒数第2个数是哪个 分成了i类
1 | class Solution { |
72. Edit Distance
518. Coin Change 2
状态表示f[i, j]
- 集合: 所有由前i种硬币凑出的总钱数等于j的凑法
- 属性: 数量
状态计算:
f[i, j] = f[i - 1, j] + f[i - 1, j - c] + f[i - 1, j - 2*c] + ... + f[i - 1, j - k*c]f[i, j - c] = f[i - 1, j - c] + f[i - 1, j - 2*c] + ... + f[i - 1, j - k*c]
由上面两式可以得出f[i, j] = f[i - 1, j] + f[i, j - c]
化成一维数组: f[j] = f[j] + f[j - c]
1 |
|