每日一算法题-最低消费

71 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

一、题目

描述

给定一个整数数组 cost  ,其中 cost[i] 是从楼梯第i个台阶向上爬需要支付的费用,下标从0开始。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。

image.png

#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、先到第二层,再到第四层
如此循环往复即可

三、模拟

  1. 三层 min(1 + 0,100 + 0) = 1
  2. 四层 min(100 + 0,1 + 1) = 2
  3. 五层 min(1 + 1,2 + 1) = 2
  4. 六层 min(1 + 2,1 + 2) = 3
  5. 七层 min(1 + 2,90 + 3) = 3
  6. 八层 min(90 + 3,1 + 3) = 4
  7. 九层 min(1 + 3,1 + 4) = 4
  8. 十层 min(1 + 4,80 + 4) = 5
  9. 顶部 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()];
}

五、结言

动态规划可以解决很多现实问题,好好掌握基础算法,从我做起!

创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!