爬樓梯問題總結 (遞推)

2022-08-17 02:12:23 字數 1412 閱讀 9279

有一樓梯共m級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第m級,共有多少種走法?

首先題目限制只能走一級或者兩級, 所以逆向思考一下, 要到達n級樓梯, 只有兩種方式,從(n-1)級 或 (n-2)級到達的。

所以可以用遞推的思想去想這題,假設有乙個陣列s[n], 那麼s[1] = 1(由於一開始就在第一級,只有一種方法), s[2] = 1(只能從s[1]上去 沒有其他方法)。

那麼就可以推出s[3] ~ s[n]了。

下面繼續模擬一下, s[3] = s[1] + s[2], 因為只能從第一級跨兩步, 或者第二級跨一步。

如果是第一級跨一步再跨一步, 就等於第二步跨一步,這就重複了。(因為每一級都是相差1, 所以不能有從哪一級跨出一步這種走法, 除了跨出一級就到達目的地)。

這題可以說是上一題的加強版,可以看成有m級樓梯,剛開始你在0級(平地), 每次能跨l步,共有多少種走法。

這題可以模擬上一題, 如果上一題只能走兩步的話,走上n級考慮(n-1)和(n-2),那麼這題可以看成走上n級考慮(n-1),(n-2)...(n-l)級。

那麼同理 s[0] = 1; s[1] = 1;

然後s[2]~s[l]就可以推了(因為這一部分的前面都不足n級,特殊考慮)

for 2~l ← i

s[i] = sum(s[0],s[i])

然後s[l+1]到s[n]的部分可以(這一部分前面肯定有n級, 一般情況)

for l+1 ~ n ← i

s[i] = sum(s[i-1 - l],s[i-1])  //總長為l的樓梯的方法數之和

最後輸出s[n]即可。

該題需要 % 1e9+7, 注意同餘的特性:

(a+b) mod n = (a mod n + b mod n) mod n

(a-b) mod n = (a mod n - b mod n + n) mod n (因為a mod n 可能小於 b mod n  所以需要加上乙個n)

#includeusing

namespace

std;

intn , l;

const

int maxn = 100005

;const

long

long mod = 1e9 + 7

;long

long

dp[maxn];

intmain()

dp[0] = dp[1] = 1

;

int t = dp[0] + dp[1

];

for(int i = 2; i <= l; i ++)

for(int i = l+1; i <= n; i++)

printf(

"%lld\n

", dp[n]);

}}

遞推解決爬樓梯問題

每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 2 階示例 2 輸入 3 輸出 3 解釋 有三種方法可以爬到樓頂。1 階 1 階 1 階 1 階 2 階 2 階 1 階 思...

遞推之爬樓梯

爬樓梯 time limit 1000 ms memory limit 65536 kib submit statistic discuss problem description 小明是個非常無聊的人,他每天都會思考一些奇怪的問題,比如爬樓梯的時候,他就會想,如果每次可以上一級台階或者兩級台階,那...

爬樓梯問題

ok,前段時間在一篇blog上看到乙個關於樓梯的面試題,大概內容如下 現有乙個人,規定他上樓梯時只能一步走乙個台階或者兩個台階。要求 給定任意樓梯的階數,求共有多少種方法爬完樓梯。如果有經驗可以看出,這是一道遞迴的題目。不過這個遞迴 程式怎麼寫呢?我的思路是可以這樣想,不管他前面 怎麼爬,最後總是要...