DP爬台阶问题
1. 初级爬台阶 - 求最短步数
LC - 70
一次可以迈1-2个台阶,因此最短步数与前两个台阶有关。
Initial state: 第一阶:1步 ; 第二阶:1步
deduction function: f[n] = f[n - 1] + f[n - 2];
====可以推出,第三阶可以从第一阶迈出,可以从第二阶迈出,因此有两种可能。基本就是斐波那契数列求和。
public int climbStairs(int n) {
if(n == 0) return 1;
if(n == 1) return 1;
int[] dp = new int[n];
dp[0] = 1;
dp[1] = 2;
for(int i = 0 ; i < n - 2 ; i++){
dp[i + 2] = dp[i] + dp[i + 1];
}
return dp[n - 1];
}
2. 求最短开销
LC - 746
每个台阶的cost不同,还是只能迈1-2个台阶,这回求到顶点的最小开销。
Initial state: 2个台阶以内最小开销为cost[0], cost[1]中的最小值。0->1->dist or 0->2->dist
deduction function: f[n] = Math.min(dp[n - 1], dp[n - 2]) + cost[n]
====> 因为可以从n-1阶跳,也可以从n-2阶跳,选开销最小的台阶。
====>注意:可以从n->dist,n-1->dist,两个点都是有效的,因此结果选两个点中最小的。
public int minCostClimbingStairs(int[] cost) {
int len = cost.length;
if(len == 0) return cost[0];
if(len == 1) return Math.min(cost[0], cost[1]);
int[] dp = new int[len];
dp[0] = cost[0];
dp[1] = cost[1];
for(int i = 2 ; i < len ; i++){
dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];
}
return Math.min(dp[len - 1], dp[len - 2]);
}
3. 1的进阶版
步数是2的幂。求有多少种组合。
因此:f[n] = f[n - 1] + f[n - 2] + f[n - 4] + ... + f[1]
public static int countSteps(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
for(int i = 0 ; i < n ; i++) {
if(i == 0 || i == 1) dp[i + 1] = i + 1;
else {
int j = 0, tmp = 0;
while(Math.pow(2, j) <= i + 1) {
tmp += dp[(int) (i + 1 - Math.pow(2, j))];
j++;
}
dp[i + 1] = tmp;
}
}
System.out.println(Arrays.toString(dp));
return dp[n];
}
莽就对了。。。
DP爬台阶问题的更多相关文章
- 70. Climbing Stairs(动态规划 爬台阶,一次只能爬1,2两节)
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- LeetCode OJ:Climbing Stairs(攀爬台阶)
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- 九度 1547 出入栈(递推DP)
题目描述: 给定一个初始为空的栈,和n个操作组成的操作序列,每个操作只可能是出栈或者入栈.要求在操作序列的执行过程中不会出现非法的操作,即不会在空栈时执行出栈操作,同时保证当操作序列完成后,栈恰好为一 ...
- 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 ...
- SDOI 2019 R1游记
$SDOI$ $2019$ $R1$游记 昨天才刚回来,今天就来写游记啦! Day -5: 做了一下去年省选的Day1,感觉很神仙. Day -4: 做了一下去年省选的Day2,感觉还是很神仙. Da ...
- 【leetcode】70-ClimbingStairs
problem ClimbingStairs 题意: 爬台阶问题,每次可以爬1个或者两个台阶,问如果有n个台阶,可以有多少种方法爬到顶部? 解析: 对于n=1,有一种方法:n=2,有两种方法: 对于n ...
- 面试10大算法汇总——Java篇
问题导读 1 字符串和数组 2 链表 3 树 4 图 5 排序 6 递归 vs 迭代 7 动态规划 8 位操作 9 概率问题 10 排列组合 11 其他 -- 寻找规律 英文版 以下从Java角度解释 ...
- 刷题70. Climbing Stairs
一.题目说明 题目70. Climbing Stairs,爬台阶(楼梯),一次可以爬1.2个台阶,n层的台阶有几种爬法.难度是Easy! 二.我的解答 类似的题目做过,问题就变得非常简单.首先用递归方 ...
- 收藏一部山地车教学视频,Fabien Barel主讲及动作示范
视频是由曾多次获得UCI速降赛的冠军车手Fabien Barel主讲及动作示范,讲解山地车越野的装备以及基本动作.视频中的要点说明我已经手录为文本,如果视频中没有看清的地方,也可以看文字. 骑行装备 ...
随机推荐
- ffmpeg命令的使用
参考博客:https://www.cnblogs.com/wainiwann/p/4128154.html 但是红色网页总结的 “ffmpeg 用法” 非常全面. http://www.360doc. ...
- 官方Canvas API文档
https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API
- expect-调试模式的使用
1.expect简介 Expect是一种TCL扩展性的语言,主要用于完成系统交互方面的功能,比如SSH.FTP等,这些程序都需要手工与它们进行互动,而使用Expect就可以模拟人手工互动的过程,是一种 ...
- 【Common】NO.81.Note.1.Common.1.001-【各种英文符号的表示及念法】
1.0.0 Summary Tittle:[Common]NO.81.Note.1.Common.1.001-[各种英文符号的表示及念法] Style:Common Series:Common Sin ...
- React之ant design的table表格序号连续自增
render(text,record,index){ return( <span>{(pagination.current-1)*10+index+1}</spa ...
- navicat for mysql 数据库备份与还原
一, 首先设置, 备份保存路径 工具 -> 选项 点开 其他 -> 日志文件保存路径 二. 开始备份 备份分两种, 一种是以sql保存, 一种是保存为备份 SQL保存 右键点击你要备份的数 ...
- Vue滑动删除与修改
Vu+element实现 <template> <div class=""> <div class="slider"> &l ...
- proto 2 语法
一.proto文件 PB的定义是通过proto文件进行定义的,一个标准的类型如下: message SearchRequest { required string query = 1; optiona ...
- android studio 中如何合并冲突(转)
合并分支,解决冲突 执行Git merge ,如果有冲突,就会出现如下格式: <<<<<<< HEAD 这个位置的内容就是当前所在分支的内容 ======= ...
- JavaScript 声明提前机制
声明提前机制 在JavaScript存在着这样一种预处理机制,即浏览器在解析JS代码时会将var声明的变量和function声明的函数提升到当前作用域的顶部.但是解析JS代码时对var和functio ...