爬樓梯演算法

2021-10-09 19:06:06 字數 2333 閱讀 4163

有n階樓梯,有1,2,3;走m步走完樓梯,一共有多少種走法,並輸出所有的走法;

設走n階台階的走法數為:f(n)

可以得到:f(1) = 1 f(2) = 2 f(3) = 4

對於n>3時,縮小問題規模:

最後一步上乙個台階的話,之前上了n-1個台階,走法為f(n-1);

最後一步上兩個台階的話,之前上了n-2個台階,走法為f(n-2);

最後一步上三個台階的話,之前上了n-3個台階,走法為f(n-3);

可以推得遞迴公式:

f(n) = f(n-1) + f(n-2) + f(n-3);

//傳入的n為n階樓梯

intrecursive

(int n)

以上**只能得到多少種走法,由於要滿足m步,此時可以優化

可以考慮:

一共n階,設走1階樓梯 i 步;2階樓梯 j 步;3階樓梯 k 步;

則:i+j+k =m ; i * 1 + 2 * j + 3 * k = n

直接使用巢狀for迴圈,輪詢所有的可能性

//宣告乙個全域性變數,二維陣列

int dp[

101]

[101]=

;//x為n階段樓梯的走法,y為要求的m步

void

recursive

(int x,

int m)

cout<<

"一共有"

<[n]<<

"種走法"

<}

宣告了乙個二維陣列,把遞迴的值放入其中,這樣的到的值就被儲存下來了,取最後的那個值,就是所有的走法的總數

由於要輸出所有的走法的具體情況

上述的**無法實現,繼續優化

需要的函式是乙個能記錄已經走了多少步的,並且能輸出當前情況的,能記錄還有多少階台階沒有走的遞迴函式;

int count;

//定義乙個全域性變數計數器

//傳入的值steped為已經走的步數,ans為最後輸出的字串答案,left為剩餘的台階數

void

func

(int steped,string ans,

int left)

//如果走了不止m步或者走過頭(台階剩餘為負)

if(steped > m || left <0)

//向三種情況遞迴搜尋,ans新增當前這一步的級數

func

(steped +

1, ans +

"1-"

, left -1)

;func

(steped +

1, ans +

"2-"

, left -2)

;func

(steped +

1, ans +

"3-"

, left -3)

;}

這樣的情況下,就可以輸出得到所有的情況了,只需要在主函式中輸出全域性變數count就可以得到所有走法的可能性了

int

main()

#include

#include

using

namespace std;

void

func

(int steped, string ans,

int left)

;int n, m;

//n為階數,m為步數

int num;

//計數器

intmain()

//傳入的值steped為已經走的步數,ans為最後輸出的字串答案,left為剩餘的台階數

void

func

(int steped, string ans,

int left)

//如果走了不止m步或者走過頭(台階剩餘為負)

if(steped > m || left <0)

//向三種情況遞迴搜尋,ans新增當前這一步的級數

func

(steped +

1, ans +

"1-"

, left -1)

;func

(steped +

1, ans +

"2-"

, left -2)

;func

(steped +

1, ans +

"3-"

, left -3)

;}

不好插入,就不插入了,自己嘗試吧

語雀原版文件

我使用的環境是vs2019

python爬樓梯演算法 爬樓梯(Python3)

假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...

演算法之爬樓梯

題目 假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?沙雕解法一 利用遞迴,就是最後一步一定是前一步走一步或倒退兩步走兩步,超時!include pch.h include include using namespace std i...

演算法題 爬樓梯

題幹 假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 核心思想 這題明顯是一道遞迴題,通用公式是climbstairs n climbstairs n 1 climbstairs n 2 但是直接...