动态规划和我们数电中学习的时序电路类似,某一时刻的状态不仅与当前时刻的输入有关,还与之前的状态有关,所以推导过程中我们需要模拟题目中的情况,来找到每一时刻状态间的关系。
做题思路如下
509. 斐波那契数
此题简单
状态方程为dp[i]=dp[i-1]+dp[2]
初始状态dp[0]=0,dp[1]=1
class Solution {
public:int fib(int n) {if (n <= 1) return n;int dp[2]={0};dp[1]=1;for (int i = 2; i <= n; i++){int tmp = dp[0]+dp[1];dp[0]=dp[1];dp[1]=tmp;}return dp[1];}
};
70. 爬楼梯
仔细分析一下就会发现,此题本质也是斐波那契数列
class Solution {
public:int climbStairs(int n) {if (n <= 2) return n;int dp[3] = {0};dp[1]=1;dp[2]=2;for (int i = 3; i <= n; i++){dp[0] = dp[1]+dp[2];dp[1]=dp[2];dp[2]=dp[0];}return dp[2];}
};
746. 使用最小花费爬楼梯
首先小于两层的楼梯可以看作是无花费的,于是从第二层楼梯看起
因为求最小花费,且每次都可爬一到两层
所以dp[i]=min (dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
由此找到关系写代码即可
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();vector<int> dp(n+1,0);for(int i = 2; i <= n; i++){dp[i] = min (dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);}return dp[n];}
};