「笔试刷题」:最小花费爬楼梯

一、题目

描述

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

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

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

数据范围:数组长度满足 1≤n≤10 ^ 5  ,数组中的值满足 1≤cost i​≤10 ^ 4 

输入描述:

第一行输入一个正整数 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 。     

二、思路解析

这道题用到的是较为简单的动态规划,而这类题的常用解法则是去分析 dp 数组的 i 下标元素代表了什么意义。

比如,在这里,dp[ i ] 代表到达第 i 个台阶时, “跳一步” 和 “跳两步” 之间较小花费的那一种方式。

因此,最后的返回值也就是 dp[ n ] 了。

有个细节的地方,就是我们的动态规划数组 dp,要创建成大小为 n + 1, 因为我们是从下标为 0  的元素都开始存的,多存了一个元素,当然也要多开一个 int 空间啦。

具体实现请看下面代码👇

三、完整代码

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int n = in.nextInt();
        int[] nums = new int[n];
        for(int i = 0; i < n; i++){
            nums[i] = in.nextInt();
        }

        int[] dp = new int[n + 1];
        dp[0] = dp[1] = 0;
        for(int i = 2; i <= n; i++){
            dp[i] = Math.min(dp[i - 1] + nums[i - 1], dp[i - 2] + nums[i - 2]);
        }

        System.out.println(dp[n]);
    }
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱敲代码的罗根

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值