C++实现746. 使用最小花费爬楼梯

核心思路是选还是不选。
opt( i ) 表示到第i个台阶的最小花费,如果是【10, 15, 20】这个题目给出的台阶是0,1,2,求得就是opt( 3 )到达第三个台阶的最小花费。
就像斐波拉契数列的计算,opt(3)需要用到opt(2) opt(1) 但是有一个选还是不选的问题
上到第三个台阶可以从第二个上,也可以从第一个上,选择最小值
选第二个台阶: opt(3) = 第二个台阶的花费+上到第二个台阶的花费
不选第二个台阶: opt(3) = 第一个台阶的花费 + 上到第一个台阶的花费
递归都是有出口的,本体是opt(0) opt(1)设置为0, 从地面上到0 1 这两个台阶不花费
在这里插入图片描述

通过下图中的树可以看到会有重叠子问题(虽然这里的opt 1 不需要计算就是0但是我懒得画更大的树了) 所以使用一个opt数组来保存以前的计算结果
就是动态规划啦!

//
// Created by wzd on 2021/12/3.
//

//凸多边形最优三角剖分
#include<bits/stdc++.h> //万能头文件,包含了目前C++所包含的所有头文件
using namespace std;

int main() {
    vector<int> cost = {10, 15, 20};
    int n = cost.size();
    vector<int> opt(n+1, 0);
    opt[0]=0;
    opt[1]=0;
    for(int i=2; i<n+1; i++)
        opt[i]=min(cost[i-1]+opt[i-1], cost[i-2]+opt[i-2]);
    cout<<opt[n];
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值