1. 程式人生 > >LeetCode Climbing Stairs 遞迴求解和動態規劃法

LeetCode Climbing Stairs 遞迴求解和動態規劃法

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?

簡單題目,相當於fibonacci數列問題,難點就是要會思維轉換,轉換成為遞迴求解問題,多訓練就可以了。

所以這種型別的題目相對於沒有形成遞迴邏輯思維的人來說,應該算是難題。

我的想法是:

每次有兩種選擇,兩種選擇之後又是各有兩種選擇,如此迴圈,正好是遞迴求解的問題。

寫成遞迴程式其實非常簡單,三個語句就可以:

int climbStairsRecur(int n) {
		if (n == 1) return 1;
		if (n == 2) return 2;
		return climbStairsRecur(n-1) + climbStairsRecur(n-2);
	}

但是遞迴程式一般都是太慢了,因為像Fibonacci問題一樣,重複計算了很多分支,我們使用動態規劃法填表,提高效率,程式也很簡單,如下:
int climbStairs(int n)
	{
		vector<int> res(n+1);
		res[0] = 1;
		res[1] = 1;
		for (int i = 2; i <= n; i++)
		{
			res[i] = res[i-1] + res[i-2];
		}
		return res[n];
	}

動態規劃法用熟了,高手就需要節省空間了,如下:
int climbStairs2(int n)
	{
		vector<int> res(3);
		res[0] = 1;
		res[1] = 1;
		for (int i = 2; i <= n; i++)
		{
			res[i%3] = res[(i-1)%3] + res[(i-2)%3];
		}
		return res[n%3];
	}

當然,不使用上面的陣列也是可以的,直接使用三個變數儲存結果也是一樣的。
//2014-2-10 update
	int climbStairs(int n)
	{
		if (n < 4) return n;
		int a = 2, b = 3, c = 5;
		for (int i = 5; i <= n; i++)
		{
			a = c;
			c = b+c;
			b = a;
		}
		return c;
	}


相關推薦

LeetCode Climbing Stairs 求解動態規劃法

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. I

約瑟夫環問題的兩種解決方式(求解陣列模擬求解

約瑟夫環問題各位Acmer肯定都遇到過,就是給你編號為從0~n-1的n個人,從頭開始報數,報到m的人離場,問最後留下的人是幾號。有兩種方法解決這個問題 第一種:陣列模擬 這種方法沒什麼好說的,就是模擬報數和離場的過程,加個訪問陣列標記一下誰離場了就好了 package H

c++使用樸素演算法(自頂向下動態規劃dp(帶備忘的自頂向下,自底向上)解決鋼條切割及執行例項結果

本博文資料來源於演算法導論第三版 動態規劃有兩種等價實現方法:帶備忘的自頂向下發(topDownWithMemoization),自底向上方法,付出額外的記憶體空間來節省計算時間,是典型的時空權衡,遞迴時會儲存每個子問題的解 長度n與對應價格p關係 1~10的對應最

關於做法與動態規劃做法的分析比較

本文內容 一、主要內容 二、動態規劃原理 三、遞迴原理 四、實驗預期現象 五、Python批量生成檔案 六、遇到的困難與解決辦法 6.1測試資料執行時間 6.2批量生成檔案 七、遞迴做法相關實驗 7.1原始碼 7.1.1遞迴做法求解斐波那契數列 7.1.2測試遞迴次數 7.2實驗資料

最大子陣列問題的暴力解法,解法,動態規劃解法暴力-混合解法

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define SIZE 5000 #define RANDOM_LIMI

輸入兩個整數nm,從數列1,2,3,...,n中隨意取幾個數,使其等於m,將其所有可能的組合列出來。 求解

/* *[email protected] 轉載請註明出處 *問題:輸入兩個整數n和m,從數列1,2,3,...,n中隨意取幾個數, *使其和等於m,將其所有可能的組合列出來。 *求解思路:(遞迴求解) *(1)如果n>m則數列中>m的部分不可能參與組

為定值得多個數的求解演算法

  題目如下:  輸入兩個整數 n 和 m,從數列1,2,3.......n 中 隨意取幾個數,  使其和等於 m ,要求將其中所有的可能組合列出來。   分析:  兩個數和為定值的演算法相信大家

Add Two Numbers[leetcode]版本迴圈版本

我寫了兩個版本供參考: 遞迴版本 ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { return addTwoNumbers

[Leetcode] Climbing Stairs

problem cli ati bin not href 可用 ger 數學問題 Climbing Stairs 題解 題目來源:https://leetcode.com/problems/climbing-stairs/description/ Description

[工作準備--演算法] 八皇后問題--求解

目標 在8*8的的國際象棋中擺上八個皇后 使其不能相互攻擊 問題分析 問題的解向量:(x0,x2,x3,….,x7) 採用陣列的下標i 表示皇后的所在行 採用陣列元素x[i]表示皇后的所在列向量 約束條件

思想例項

先給一個簡單的階乘例子: public static int getDg(int x){ System.out.println(x); if (x==1) { return 1; } if (x<4) { return x * getDg(x-1);

求解單鏈表中的最大值

1 #include<iostream> 2 using namespace std; 3 4 typedef struct LNode { 5 int data; 6 LNode *next; 7 }Lnode, *LinkList; 8 9 bool

LeetCode—77. Combinations_暴力搜尋_dfs_深度優先

題目是這樣的: 首先說明這是一個經典的遞迴窮舉搜尋問題——dfs(深度優先搜尋)題目給定N在從1...........n中存在K個數組能夠排列,就是從n中選擇k個數字進行排列。 首先老套路定義一個全域性變數來接受所得的答案,然後在函式中定義一個path(所有的路徑方案),然後就是從第一

求解走臺階問題,一次可以走一步、兩步、三步、...、n步(經典面試題——增強版走臺階)

1、問題描述       現在有一個臺階,一共有n階,你一次性可以走1步、2步、3步、......、n步。問:一共有多少種走法。 2、求解思路       第一步走1階:那麼這種情況下的走法數量和剩下n-1階的走法數量有關;

貪心演算法,演算法,動態規劃演算法比較與總結

一般實際生活中我們遇到的演算法分為四類: 一>判定性問題 二>最優化問題 三>構造性問題 四>計算性問題 而今天所要總結的演算法就是著重解決 最優化問題 《演算法之道》對三種演算法進行了歸納總結,如下表所示: 分

python3基礎(七)-函式匿名函式

1、遞迴函式 函式內呼叫自己本身函式,就叫做遞迴函式。 計算一個數字的階乘n!=1*2*3*4*......*n 公式演變: n! = 1 * 2 * 3 * 4 * ...... * (n - 2) * (n - 1) * n = n * (n - 1) * (n - 2) *

關於二叉樹的遍歷:方式方式

首先來定義樹的節點: package test2018925.findTree; public class Node { public int value; public Node left; public Node right; public Node(int data){ this.va

Java:利用求解分桔子問題

問題描述:        日本著名數學遊戲專家中村義作教授提出這樣一個問題:父親將2520個桔子分給六個兒子。分完 後父親說:“老大將分給你的桔子的1/8給老二;老二拿到後連同原先的桔子分1/7給老三;老三拿到後連同原先的桔子分1/6給老四;老四拿到後連同

僅使用函式棧操作逆序一個棧

題目 一個棧依次壓入1,2,3, 4, 5,那麼從棧頂到棧底分別為5, 4, 3, 2, 1。將這個棧轉置後,從棧頂到棧底為1,2,3, 4, 5,也就是實現棧中元素的逆序,但是隻能使用遞迴函式來實現,不能使用其他資料結構。 解題參考和一些坑 共兩個遞迴函式來實現逆序: 第一個函

Java 通過求解漢諾塔問題 原始碼 經典問題講解

漢諾塔問題描述:有三根柱子 A、B、C ,在A從下向上按照從大到小的順序放著64個圓盤,以B為中介,把盤子全部移動到C上。移動過程中,要求任意盤子的下面要麼沒有盤子,要麼只能有比它大的盤子。 分析:為了將N個盤子從A移動到C,需要先把第N個盤子上面的N-1個盤子移動到B上,這樣才能將第