[LC难题必须要解决系列][之][DP] Min Cost Climbing Stairs

Min Cost Climbing Stairs

https://leetcode.com/problems/min-cost-climbing-stairs/

On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed).

Once you pay the cost, you can either climb one or two steps. You need to find minimum cost to reach the top of the floor, and you can either start from the step with index 0, or the step with index 1.

Example 1:

Input: cost = [10, 15, 20]
Output: 15
Explanation: Cheapest is start on cost[1], pay that cost and go to the top.

Example 2:

Input: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
Output: 6
Explanation: Cheapest is start on cost[0], and only step on 1s, skipping cost[3].

Intuition:

这题要求最小cost,也是求极值问题,可以想到用DP。同时我们也可以清楚知道这和paint house一样也属于状态序列类问题,假设我们用一维数组f[i] 表示前i个楼梯要花的最小cost,这样我们的最后一步就是前n个楼梯要花的最小cost。

方程:f[i] = Math.min(f[i-1], f[i-2]) + A[i];

初始:f[0] = A[0], f[1] = A[0] + A[1];

计算顺序:从0到n,结果取f[n-1];

Time conplexity: O(n);

    public int minCostClimbingStairs(int[] A) {
        int n = A.length;
        int[] f = new int[n];
        f[0] = A[0];
        f[1] = A[1];

        for (int i = 2; i < n; i ++){
            f[i] = Math.min(f[i-1], f[i-2]) + A[i];
        }

        return Math.min(f[n-2], f[n-1]);
    }

Climbing Stairs

https://leetcode.com/problems/climbing-stairs/

这个题也是一样能求极值问题想到DP,从最后一步考虑我们可以快速得到方程,f[i-1] + f[i-2]。这里就不详细写思路了。

class Solution {
    public int climbStairs(int n) {
        if (n <= 1) return 1;

        int[] f = new int[n];
        f[0] = 1;
        f[1] = 1;

        for (int i = 2; i < n; i ++){
            f[i] = f[i-1] + f[i-2];
        }

        return f[n-1] + f[n-2];
    }
}

原文地址:https://www.cnblogs.com/timoBlog/p/9733860.html

时间: 2024-10-24 13:10:59

[LC难题必须要解决系列][之][DP] Min Cost Climbing Stairs的相关文章

[LC] 746. Min Cost Climbing Stairs

On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay the cost, you can either climb one or two steps. You need to find minimum cost to reach the top of the floor, and you can either start from the step w

学渣乱搞系列之dp斜率优化

学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很大部分参考了大神Accept的文章,不过此神貌似早已绝迹江湖,这篇文章写得好,也写得很差,前半部分叙述得很好,可是关键,关键部分说得很乱,有些许错误,很多大神都进行了评论指出,但是大神Accept貌似没有修改的意思,故重新总结下,以便自己以后查阅和复习啊. 下面看一个例题Print Article.

动态规划学习系列——划分DP(一)

划分型DP,是解决跟划分有关的题目的一种DP思路,个人觉得,是目前接触的DP类型中最难的一种,因为感觉思路并不确定,不过正是不确定,才可以体会到算法的精妙之处. 题目链接:wikioi_1017 要求是将一个n位的数分成m部分,使各部分的乘积最大.解题的思路基于一个事实:当前的数可以分成m-1部分,那么加多几位分成m部分不是可以从原来的推出来.从这句差不多是废话的话中我们就可以推出状态转移方程: dp[i][k]=max(dp[i][k],dp[j][k-1]*a[j+1][i]); ( k <

nyoj 1208——水题系列——————【dp】

水题系列 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述     给你一个有向图,每条边都有一定的权值,现在让你从图中的任意一点出发,每次走的边的权值必须必上一次的权值大的情况下,问你最多能走几条边? 输入 首先一个n和m,分别表示点的数目和边的数目接下来m行,每行三个值x,y,val,表示x到y有路,其权值为val.(1<n,m,val<10^5,0<x,y<=n) 输出 输出最多有的边的数目 样例输入 3 3 1 2 1 2 3 1 3 1 1 6

动态规划学习系列——划分DP(二)

划分型DP第二题,wikioi 1039,与第一题乘积最大思路有所不同. 题目要求: 将一个数划分成几部分,问一共有多少种分法. 真 · 解题思路: 其实跟小学奥赛的一些题有点像,我们先来看一个例子: 7 分成 3 部分,有四种办法: 1,1,5:1,2,4:1,3,3:2,2,3 . 我们人脑来考虑问题的时候是怎么想的呢?显然,从1开始,1是第1部分,然后剩下6分成2部分,我们依然是从1开始考虑,1是第2部分,然后5是第3部分:同样接下来考虑第2部分是2,则第3部分是4:接着考虑第2部分是3,

动态规划学习系列——划分DP(三)

划分DP第三题,wikioi 1040,送我n个WA~~~ 题目大意: 这道题题述有着UVA的特色,够废话,其实就是读入一个长度最大200的字符串(不知道为何要分行输入,完全没有意义啊),分成m部分,使各部分单词量加起来最大 解题思路: 这题划分的部分跟乘积最大那题其实很像,状态转移方程也很容易想到: dp[i][k]=max(dp[i][k],dp[j][k-1]+scnt[j+1][i]) ( j >= k-1 ) scnt数组:scnt[j][i] 表示区间 j~i 所包含的单次总数 接下

《完美解决系列》Android5.0以上 Implicit intents with startService are not safe

在Android6.0上,使用了以下代码: Intent intent = new Intent(); intent.setAction("xxx.server"); bindService(intent, mConn, Context.BIND_AUTO_CREATE); 提示了警告的异常: Implicit intents with startService are not safe 查了一下源码,原来在5.0上就必须强制使用显示方式来启动Service. private void

为什么会决定进行分库分表,分库分表过程中遇到什么难题,如何解决的?

一.为什么决定进行分库分表? 根据业务类型,和业务容量的评估,来选择和判断是否使用分库分表 当前数据库本事具有的能力,压力的评估 数据库的物理隔离,例如减少锁的争用.资源的消耗和隔离等 热点表较多,并且数据量大,可能会导致锁争抢,性能下降 数据库的高并发,数据库的读写压力过大,可能会导致数据库或系统宕机 数据库(MySQL5.7以下)连接数过高,会增加系统压力 单表数据量大,如SQL使用不当,会导致io随机读写比例高.查询慢(大表上的B+树太大,扫描太慢,甚至可能需要4层B+树) 备份和恢复时间

动态规划系列 Leetcode 70. Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? Note: Given n will be a positive integer. Example 1: Input: 2 Output: 2 Explanation: