持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
一、题目
描述
给定一个整数数组 cost ,其中 cost[i] 是从楼梯第i个台阶向上爬需要支付的费用,下标从0开始。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int minPrice(vector<int>& cost){
}
int main(int, char*[])
{
vector<int> cost = {1, 100, 1, 1, 1, 90, 1, 1, 80, 1};
cout << "最少花费:" << minPrice(cost) << endl;
}
二、分析
由题意可知,这典型的动态规划问题,通过不断的求局部最优解来达到全局最优解,要想达到这个目的,首先要划分局部问题。
题中规定爬楼梯,爬一层或两层,需要支付相应的费用,最终达到顶部,很显然,这爬一次就是一次求局部最优解。
待选项为爬一层或两层,那求最优解就是在爬一层和爬两层之间选择最小花费那个。
而爬第一层和第二层不需要前置条件,所以不用参与规划。
要爬到第三层,有两种走法:
1、先到第一层,再到第三层
2、先到第二层,再到第三层
这时计算爬到第三层的最小花费,只需计算出两种走法的价格,取其中最少的那个。
要爬到第四层,有两种走法:
1、先到第三层,再到第四层
2、先到第二层,再到第四层
如此循环往复即可
三、模拟
- 三层 min(1 + 0,100 + 0) = 1
- 四层 min(100 + 0,1 + 1) = 2
- 五层 min(1 + 1,2 + 1) = 2
- 六层 min(1 + 2,1 + 2) = 3
- 七层 min(1 + 2,90 + 3) = 3
- 八层 min(90 + 3,1 + 3) = 4
- 九层 min(1 + 3,1 + 4) = 4
- 十层 min(1 + 4,80 + 4) = 5
- 顶部 min(80 + 4,5 + 1) = 6
四、实现
int minPrice(vector<int>& cost){
vector<int> prices(cost.size() + 1, 0);
for(size_t i = 2; i < prices.size(); ++i){
prices[i] = min(prices[i - 2] + cost[i - 2], prices[i - 1] + cost[i - 1]);
}
return prices[cost.size()];
}
五、结言
动态规划可以解决很多现实问题,好好掌握基础算法,从我做起!
创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!