[动态规划]NC296 DP4 最小花费爬楼梯

题目描述

给定一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用,下标从0开始。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

数据范围:数组长度满足 1 ≤ n ≤ 1 0 5 1 ≤ n ≤10^5 1n105
数组中的值满足 1 ≤ c o s t [ i ] ≤ 1 0 4 1≤ cost[i] ≤10^4 1cost[i]104

输入描述:
第一行输入一个正整数 n ,表示数组 cost 的长度。
第二行输入 n 个正整数,表示数组 cost 的值。
输出描述:
输出最低花费
示例1

输入:
3
2 5 20
输出:
5
说明:你将从下标为1的台阶开始,支付5 ,向上爬两个台阶,到达楼梯顶部。总花费为5

示例2

输入:
10
1 100 1 1 1 90 1 1 80 1
输出:
6
说明:
你将从下标为 0 的台阶开始。
1.支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
2.支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
3.支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
4.支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
5.支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
6.支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

题目链接

核心代码模式
NC296 最小花费爬楼梯
ACM 模式
DP4 最小花费爬楼梯

状态方程

s t e p [ i ] = m i n ( s t e p [ i − 1 ] + c o s t [ i − 1 ] , s t e p [ i − 2 ] + c o s t [ i − 2 ] ) step[i] = min(step[i - 1] + cost[i - 1], step[i - 2] + cost[i - 2]) step[i]=min(step[i1]+cost[i1],step[i2]+cost[i2])

我的题解

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param cost int整型vector
     * @return int整型
     */
    int minCostClimbingStairs(vector<int>& cost) 
    {
        int csz = cost.size();//cost size
        auto step = new int[csz + 1];

        step[0] = step[1] = 0;//初始化

        for (int i = 2; i <= csz; ++i) 
        {
            step[i] = min(step[i - 1] + cost[i - 1], step[i - 2] + cost[i - 2]);
        }
        int ret = step[csz];
        delete [] step;
        return ret;
    }
};
#include <iostream>
using namespace std;

int main() 
{
    int n = 0;
    cin >> n;
    auto step = new int[n + 1];
    auto cost = new int[n];

    step[0] = step[1] = 0;

    for(int i = 0; i < n; ++i)
        cin >> cost[i];
    for(int i = 2; i <= n; ++i)
    {
        step[i] = min(step[i - 1] + cost[i - 1], step[i - 2] + cost[i - 2]);
    }
    cout << step[n] << endl;
    delete [] step;
    delete [] cost;
    return 0;
}

写在最后:题目中的new/delete可以直接用数组实现

官方题解链接

官方题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值