使用最小花费爬楼梯 (LeetCode - 746)

使用最小花费爬楼梯

描述

你需要爬上一个N层的楼梯,在爬楼梯过程中,每阶楼梯需花费非负代价,第i阶楼梯花费代价表示为cost[i],一旦你付出了代价,你可以在该阶基础上往上爬一阶或两阶。你可以从第0阶或者第1阶开始,请找到到达顶层的最小的代价是多少
N和cost[i]皆为整数,且N∈[2,1000],cost[i]∈[0,999]

输入

输入为一行整数,对应cost数组

输出

输出一个整数,表示花费的最小代价

输入样例 1 

1 100 1 1 1 100 1 1 100 1

输出样例 1

6
解释: 最低花费方式是从cost[0]开始,逐个经过那些1,跳过cost[3],一共花费6。

输入样例 2 

10 15  20

输出样例 2

15
解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。

方法一:dp[i]中存储的是到达i-1和i-2中最少的花费

例如样例1:1 100 1 1 1 100 1 1 100 1

dp[0]和dp[1]是可以直接出发的点,所以在他们之前的最少花费为0.

dp[0]=0   dp[1]=0 ;

dp[2]中要存储到达0和1中最少的花费:dp[0]+cost[0]=0+1=1, dp[1]+cost[1]=0+100=100, 所以dp[2]=1;

dp[3]中要存储到达1和2中最少的花费:dp[1]+cost[1]=0+100=100, dp[2]+cost[2]=1+1=2, 所以dp[3]=2;

dp[4]中要存储到达2和3中最少的花费:dp[2]+cost[2]=1+1=2, dp[3]+cost[3]=2+1=3, 所以dp[4]=2;

dp[5]中要存储到达3和4中最少的花费:dp[3]+cost[3]=2+1=3, dp[4]+cost[4]=2+1=3, 所以dp[5]=3;

dp[6]中要存储到达4和5中最少的花费:dp[4]+cost[4]=2+1=3, dp[5]+cost[5]=3+100=103, 所以dp[6]=3;

dp[7]中要存储到达5和6中最少的花费:dp[5]+cost[5]=3+100=103, dp[6]+cost[6]=3+1=4, 所以dp[7]=4;

dp[8]中要存储到达6和7中最少的花费:dp[6]+cost[6]=3+1=4, dp[7]+cost[7]=4+1=5, 所以dp[8]=4;

dp[9]中要存储到达7和8中最少的花费:dp[7]+cost[7]=4+1=5, dp[8]+cost[8]=4+100=104, 所以dp[9]=5;

dp[10]中要存储到达8和9中最少的花费:dp[8]+cost[8]=4+100=104, , dp[9]+cost[9]=5+1=6, 所以dp[10]=6;

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int[] dp=new int[10000];
        dp[0]=0;
        dp[1]=0;
        for(int i=2;i<cost.length+1;i++)
        {
            dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
       return dp[cost.length];
    }
}

方法二:dp[i]中存储的是到达i的最低花费

dp[0]最低花费即为cost[0] , dp[1]最低花费即为cost[1].

dp[0]=1, dp[1]=100

dp[2] = dp[0]和dp[1]中的最低花费 + cost[2] = dp[0]+1=2

dp[3] = dp[1]和dp[2]中的最低花费 + cost[3] = dp[2]+1=3

dp[4] = dp[2]和dp[3]中的最低花费 + cost[4] = dp[2]+1=3

dp[5] = dp[3]和dp[4]中的最低花费 + cost[5] = dp[3]+100=dp[4]+100=103

dp[6] = dp[4]和dp[5]中的最低花费 + cost[6] = dp[4]+1=4

dp[7] = dp[5]和dp[6]中的最低花费 + cost[7] = dp[6]+1=5

dp[8] = dp[6]和dp[7]中的最低花费 + cost[8] = dp[6]+100=104

dp[9] = dp[7]和dp[8]中的最低花费 + cost[9] = dp[7]+1=6

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int[] dp=new int[10000];
        dp[0]=cost[0];
        dp[1]=cost[1];
        for(int i=2;i<cost.length;i++)
        {
            dp[i]=Math.min(dp[i-1],dp[i-2])+cost[i];
        }
       return Math.min(dp[cost.length-1],dp[cost.length-2]);
    }
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor,可以在编辑器选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值