文章目录
动态规划题目特点
1.计数
2.最值
3.存在性
动态规划解题流程
1.确定状态dp[i][j] 最后一步、子问题
2.状态转移方程
3.初始条件,边界情况
4.计算顺序
例题
1.Coin Change
【最值问题】
状态:dp[i]表示最少dp[i]枚硬币拼出i元
状态转移方程:dp[i]=min{dp[i-2]+dp[i-5]+dp[i-7]}+1
初始边界:dp[0]=0;其他元素初始化为无穷大。
计算顺序:从小到大
2.Unique Path
【计数问题】
状态:dp[i][j]表示从(0,0)到(i,j)有多少条路径
状态转移方程:dp[i][j]=dp[i-1][j] + dp[i][j-1]
初始边界:dp[0][0]=0; dp[i][0]=dp[0][j]=1;
计算顺序:逐行计算
3.Jump Game
【存在性问题】
状态:dp[j]表示青蛙能否跳到位置 j
状态转移方程:遍历a<=i<j,dp[j] = OR(dp[i] && i + a[i] >= j)
初始边界:dp[0]=true;
计算顺序:从小到大
4.最大连续子数组和
【最值问题】题目链接
状态:dp[i]表示以nums[i]结尾的最大连续子数组和
状态转移方程:dp[i] = max(nums[i], nums[i]+dp[i-1])
初始边界:dp[0]=nums[0].maxL=nums[0];
计算顺序:从小到大
5.爬楼梯
【计数问题】题目链接
状态:dp[i]表示到第i个台阶的方法数
状态转移方程:dp[i]=dp[i-1]+dp[i-2]
初始边界:dp[0]=1,dp[1]=2;
计算顺序:从小到大
6.买股票最佳时机(只交易一次)
【最值问题】题目链接
状态:dp[i]表示第i天卖出的最大利润
状态转移方程:dp[i] = prices[i] - miniPrice;
边界条件:miniPrice=prices[0],maxP=0;
计算顺序:从小到大
7.除数博弈
【存在性问题】 题目链接
状态:dp[i]表示数字为i起手是否必胜
状态转移方程:dp[i] = 1<=j<i OR(i%j==0 && !dp[i-j])
初始边界:dp[1]=false; dp[2]=true;
计算顺序:从小到大
8.判断子序列
【存在性问题】题目链接
状态:dp[i][j]表示t的i位置后字符a[j]出现的索引
状态转移方程:
dp[i][j] = i (t[i]==a[j])
dp[i][j] = dp[i+1][j] (t[i]!=a[j])
初始边界:dp[m][]=m
计算顺序:从大到小
9.栏杆涂色
【计数问题】题目链接
状态:dp[i]表示i个栏杆涂色方案数
状态转移方程:dp[i]=dp[i-1]*(k-1) + dp[i-2] *(k-1)1
初始边界:dp[1]=k;dp[2]=kk;
计算顺序:从小到大
10.按摩师
【最值问题】题目链接
状态:dp[i][0]:第i个人不约的最大累计时长 dp[i][1]:第i个人约的最大累计时长
状态转移方程:
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = dp[i-1][0] + nums[i];
初始边界:dp[1][0]=0;dp[1][1]=nums[1];
计算顺序:从小到大
11.使用最小花费爬楼梯
【最值问题】题目链接
状态:dp[i]:到第i阶楼梯的最小花费
状态转移方程:dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])
初始边界:dp[0]=0;dp[1]=0;
计算顺序:从小到大
12.三步问题
【计数问题】题目链接
状态:dp[i]:爬到第i阶台阶的方法数的模
状态转移方程:dp[i]=((dp[i-1]+dp[i-2])/BASE+dp[i-3])/BASE
(a+b)%c = (a%c+b)%c
初始边界:dp[1]=1,dp[2]=2,dp[3]=4;
计算顺序:从小到大
13.最长回文子串
【最值问题】题目链接
状态:dp[i][j]表示字符串s[i,j]是否为回文串
状态转移方程:dp[i][j] = dp[i+1][j-1] && s[i]==s[j]
初始边界:长度为1时dp[i][j]=1,长度为2时dp[i][j]= s[i]==s[j];
计算顺序:从小到大(从短到长)
本题其他解法:中心扩散法:O(n^2) Manacher算法:O(n)
14.不同的二叉搜索树
【计数问题】题目链接
状态:dp[i] i个节点有多少种二叉树
状态转移:分别以1~i为根节点构建二叉搜索树的种类和即为dp[i]
状态转移方程:dp[i] =
Σ
\Sigma
Σ dp[j]*dp[i-1-j] (0<=j<n)
初始边界:dp[0]=1,dp[1]=1;
计算顺序:从小到大
15.买股票最佳时机(含冷冻期,多次交易)
【最值问题】题目链接
状态:dp[i]当前累计最大收益
dp[i][0]:当前持有股票:前一日持有保持或今日买入
dp[i][1]:当前未持有股票,冷冻期:前一日持有今日卖出
dp[i][2]:当前未持有股票,非冷冻期:前一日未持有保持
状态转移方程:
dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i-1]);
dp[i][1] = dp[i-1][0] + prices[i-1];
dp[i][2] = max(dp[i-1][1], dp[i-1][2]);
初始边界:
dp[1][0] = -1*prices[0];
dp[1][1] = 0;
dp[1][2] = 0;
计算顺序:从小到大
16.最小路径和
【最值问题】题目链接
状态:dp[i][j]到坐标(i,j)的最小路径和
状态转移方程:dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
初始边界:dp[0][0]=grid[0][0];
计算顺序:逐行计算