动态规划

动态规划题目特点

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]=k
k;
计算顺序:从小到大

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];
计算顺序:逐行计算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值