动态规划问题 -- 斐波那契数列模型(使用最小花费爬楼梯)
目录
- 动态规划分析问题五步曲
- 题目概述
- 代码编写
动态规划分析问题五步曲
不清楚动态规划分析问题是哪关键的五步的少年们可以移步到
链接: 动态规划算法基础
这篇文章非常详细的介绍了动态规划算法是如何分析和解决问题的
题目概述
链接: 最小花费爬楼梯
- 状态表示(题目要求+自己的经验)
本题状态dp[i] :dp[i]表示站在第i个台阶上要花费的最小体力(支付本台阶的花费)- 状态转移方程推导
分析第i个位置,显然可以从第i-1和i-2个位置跳到第i个位置
再结合本题的状态表示,状态转移方程:
dp[i] = min(dp[i],dp[i-1]) + cost[i];
- 初始化(防止越界+结合状态表示初始化)
当i < 2 时数组下标可能小于0越界,因此令dp[0] = cost[0];
dp[1] = cost[1];- 填表顺序(分析要填i位置前一个依赖状态的位置)
显然是从左到右- 返回值(由题目要求来)
dp的最后一个位置和倒数第二个位置都可以跳到终点,所以返回二者的小值
代码编写
int minCostClimbingStairs(vector<int>& cost) {if(cost.size() == 2) //这种情况表示都可以跳到楼顶return min(cost[0],cost[1]);vector<int> dp(cost.size());dp[0] = cost[0] , dp[1] = cost[1];for(int i = 2 ; i < dp.size() ; i++)dp[i] = min(dp[i-1],dp[i-2]) + cost[i];return min(dp[dp.size()-1] , dp[dp.size()-2]);}
少年们今天你又进步了一点哟,继续加油吧