dynamic-programming

动态规划算法模板:

[bash]
1
2
3
4
5
6
7
8
9
10
11
12
result = []
void dynamic_programming(路径, 选择列表) {
// 1.通用初始化
vector<int> dp(容量 + 1, base case1);
// 2.边界初始化
dp[0][0][...] = base case2;
// 3.状态转移
for 状态1的个数
for 状态2的个数
for ...
dp[状态1][状态2][...] = 求最值 or 求和(选择1, 选择2,...);
}

按照如下顺序刷力扣上的题目,相信会帮你在学习回溯算法的路上少走很多弯路。

509. 斐波那契数

1137. 第 N 个泰波那契数

70. 爬楼梯

746. 使用最小花费爬楼梯

198. 打家劫舍:dp[i] = max(dp[i-1], dp[i-2] + nums[i])

213. 打家劫舍 II int res = max(helper(nums, 0, size - 2), helper(nums, 1, size - 1));

740. 删除并获得点数

55. 跳跃游戏

45. 跳跃游戏 II

53. 最大子序和: dp[i]是以nums[i]结尾的最大自序和

918. 环形子数组的最大和

152. 乘积最大子数组

1567. 乘积为正数的最长子数组长度

1014. 最佳观光组合

121. 买卖股票的最佳时机

122. 买卖股票的最佳时机 II:vector<vector> dp(n, vector(2, 0)); dp[i][1]表示第i天持有股票

309. 最佳买卖股票时机含冷冻期

714. 买卖股票的最佳时机含手续费

343. 整数拆分:dp[i]拆分数字能获得的最大乘积,dp[i]=max(j*i-j, j*dp[i-j])

剑指 Offer 14- I. 剪绳子

416. 分割等和子集:dp[i][j]表示下标[0, i]区间内是否能选出一些数使其之和恰好为j

139. 单词拆分

42. 接雨水

413. 等差数列划分

91. 解码方法

264. 丑数 II

96. 不同的二叉搜索树:dp[i] = dp[]

118. 杨辉三角

119. 杨辉三角 II

931. 下降路径最小和

120. 三角形最小路径和

1314. 矩阵区域和

304. 二维区域和检索 - 矩阵不可变

62. 不同路径

63. 不同路径 II

64. 最小路径和

221. 最大正方形

5. 最长回文子串

516. 最长回文子序列

300. 最长递增子序列:dp[i] = max(dp[i], dp[j] + 1);

376. 摆动序列

392. 判断子序列

1143. 最长公共子序列

72. 编辑距离

322. 零钱兑换

518. 零钱兑换 II

377. 组合总和 Ⅳ

343. 整数拆分

279. 完全平方数