楼梯

CodeForces1249E-By Elevator or Stairs?-好理解自己想不出来的dp

随声附和 提交于 2019-12-02 19:25:12
Input The first line of the input contains two integers n n and c c ( 2 ≤ n ≤ 2 ⋅ 10 5 , 1 ≤ c ≤ 1000 2≤n≤2⋅105,1≤c≤1000) — the number of floors in the building and the time overhead for the elevator rides. The second line of the input contains n − 1 n−1 integers a 1 , a 2 , … , a n − 1 a1,a2,…,an−1 ( 1 ≤ a i ≤ 1000 1≤ai≤1000), where a i ai is the time required to go from the i i-th floor to the ( i + 1 ) (i+1)-th one (and from the ( i + 1 ) (i+1)-th to the i i-th as well) using the stairs. The third line of the input contains n − 1 n−1 integers b 1 , b 2 , … , b n − 1 b1,b2,…,bn−1 ( 1 ≤ b i ≤

20191026-跳台阶

大兔子大兔子 提交于 2019-12-02 12:45:05
斐波那契数列 - 矩阵算法 \(O(lgn)\) - 待补充 跳台阶 - 经典问题 递归 - basic解法,浪费栈空间 动态规划 - 常规解法,转移方程可以有很多变化 打表 - 按照转移方程提前计算 注意 :台阶数很多的时候,需要 手写大数加法 变态跳台阶/观察法 跳石板/动态规划 爬楼梯/ 大数 跳台阶 爬楼梯2/ 大数加法 变态跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法 \(2^{n-1}\) 思路 思路1 青蛙一次可以跳1~n之间的台阶数,考虑如下情况 青蛙一次跳n阶,则1~n-1的所有台阶均不经过 青蛙第一次跳n-1阶,第二次跳1阶,等价于仅选中n-1阶 所以,观察可得,每种跳台阶方案都对应了1~n-1中的唯一一组选择 1~n-1共n-1级台阶,每级台阶都有选or不选两种情况 总的跳法数目为 \(2^{n-1}\) 思路2 \(f(n-1)=2^{n-2}\) 数学归纳法 \(f(n)=1+f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)\) \(f(n)=2^{n-1}\) 跳石板 小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3....... 这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步

算法分析之爬楼梯问题

半城伤御伤魂 提交于 2019-11-30 20:49:30
一个人每次只能走一层楼梯或者两层楼梯,问走到第n层楼梯一共有多少种方法 利用动态规划实现如下: #include <iostream> using namespace std; const int MAX = 100; int result[MAX]; int fib_time(int n) { int res; if (result[n]>0) //若大于零,说明该子问题原来已经求过解 return result[n]; //直接返回对应的数组元素 if (n == 0 || n == 1) res = 1; else res = fib_time(n - 1) + fib_time(n - 2); result[n] = res; //每次都将求过解的子问题赋给对应数组元素 return res; } int main() { int i = 0; int n = 0; cout << "Please input the number of Stairs:" << endl; cin >> n; for (i = 0; i <= n; i++) { result[i] = -1; } cout << "The differ_way_number is:"<<endl<<fib_time(n) << endl;; return 0; } 测试: 来源: https://www

爬楼梯

梦想与她 提交于 2019-11-29 21:42:22
在你面前有一个n阶的楼梯,你一步只能上1阶或2阶。 请问计算出你可以采用多少种不同的方式爬完这个楼梯。 输入描述: 一个正整数n(n<=100),表示这个楼梯一共有多少阶 输出描述: 一个正整数,表示有多少种不同的方式爬完这个楼梯 #include<iostream> #include<vector> #include<algorithm> using namespace std; string add(string&a,string&b){ string res; int tmp=0; int i,j; for(i=a.length()-1,j=b.length()-1;i>=0&&j>=0;i--,j--){ res.push_back(char((a[i]-'0'+b[j]-'0'+tmp)%10+'0')); tmp=(a[i]-'0'+b[j]-'0'+tmp)/10; } if(j!=-1){ for(;j>=0;j--){ res.push_back(char((b[j]-'0'+tmp)%10+'0')); tmp=(b[j]-'0'+tmp)/10; } } if(i!=-1){ for(;i>=0;i--){ res.push_back(char((a[i]-'0'+tmp)%10+'0')); tmp=(a[i]-'0'+tmp)/10; } } if(tmp

(28)Go记忆化搜索和动态规划解决问题

北慕城南 提交于 2019-11-29 06:31:16
问题1:求爬楼梯方法 // 结构图如下 根据上图,可以推导出: 设c(n)为爬n阶楼梯的方法总数 例1)每次可以爬 1 或 2 个台阶,则c(n)=c(n-1)+c(n-2) 例2)每次可以爬 1 或 2 或 3 个台阶,则c(n)=c(n-1)+c(n-2)+c(n-3) 理解好这点,代码就容易写了 动态规划实现 func climbStairs(n int) int { if n < 2 { return 1 // 无台阶可走算1种 } memo := make([]int, n+1) memo[0] = 1 memo[1] = 1 for i := 2; i <= n; i++ { memo[i] = memo[i-1] + memo[i-2] } return memo[n] } 提交leetcode,通过 问题2:求三角形最短路径和 // 思路:先弄清该三角形的数学关系 第x行有x+1个点,x行y列点的下一行相邻两点坐标是[x+1][y],[x+1][y+1] 理解好这点,之后写代码较容易 // 解法1:动态规划1--二维空间存储 (理解好解法1有助于理解解法2) // 定义(n+1)*(n+1)的二维数组minDis[][]int // minDis[i][j]代表triangle[i][j]到达底部的最短距离,最底层最短距离为本身的值 // minDis[0][0

爬楼梯(斐波那契数列)—动态规划

浪尽此生 提交于 2019-11-28 03:28:18
递归和动态规划问题都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是:动态规划保存了子问题的解,避免重复计算。 爬楼梯:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 题解:定义一个数组dp存储上楼梯的方法数,dp[i]表示走到第i个楼梯的方法数。第 i 个楼梯可以从第 i-1 和 i-2 个楼梯再走一步到达,走到第 i 个楼梯的方法数为走到第 i-1 和第 i-2 个楼梯的方法数之和。 /** * */ package leetcode; import java.util.Scanner; /** * @author 李佳琪 * */ public class Floor { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); while(scanner.hasNext()){ int n = scanner.nextInt(); int count = solve(n); System.out.println(count); } scanner.close(); } public

VI和gedit的区别

*爱你&永不变心* 提交于 2019-11-28 02:36:33
http://www.cnblogs.com/Sivar/articles/1896418.html 打个比方 以前的高楼只有楼梯,你用惯了楼梯,进入楼道,左转直接上楼,没有任何多余的事 现在有了电梯,你得先按按钮,然后等着电梯从上面下来(假设电梯在上面),然后等着开 门,进去关门以后还得选择上几楼。。。如果上错了,还得重复上面的动作下到几楼。。。 用了电梯以后你感觉也别扭了,不能左转直接上了,不能上错了后方便的下来了,不能。。 ——————————————————————————————————————————————————————————————————————————————————————————————>>>> From Sivar's: http://www.cnblogs.com/Sivar Thanks for your reading. 分类: Tools相关 转载于:https://www.cnblogs.com/asic/archive/2011/05/30/2063831.html 来源: https://blog.csdn.net/weixin_30343157/article/details/99922545

算法 - 上楼梯(跳台阶)

筅森魡賤 提交于 2019-11-26 01:49:36
楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,走完n阶台阶共有多少种不同的走法? 假设n阶台阶有f(n)种走法,第1步有2种走法 如果上1阶,那就还剩n - 1阶,共f(n - 1)种走法 如果上2阶,那就还剩n - 2阶,共f(n - 2)种走法 所以f(n) = f(n - 1) + f(n - 2) int climbStairs ( int n ) { if ( n <= 2 ) return n ; return climbStairs ( n - 1 ) + climbStairs ( n - 2 ) ; } 跟斐波那契数列几乎一样,因此优化思路也是一致的 int climbStairs ( int n ) { if ( n <= 2 ) return n ; int first = 1 ; int second = 2 ; for ( int i = 3 ; i <= n ; i ++ ) { second = first + second ; first = second - first ; } return second ; } 来源: CSDN 作者: 玉树临风你卓哥 链接: https://blog.csdn.net/songzhuo1991/article/details/103235763