假設你現在正在爬樓梯,樓梯有n級。每次你只能爬1級或者2級,那麼你有多少種方法爬到樓梯的頂部?
格式:
第一行輸入乙個數n(n<=50),代表樓梯的級數。
接下來一行輸出你的方法總數。
樣例1
輸入:
5 輸出:
8 很容易想到這道題可以用遞迴的方法:
分析:假設從底走到第n級的走法有f(n)種,走到第n級有兩個方法,乙個是從(n-1)級走一步,另乙個是從第(n-2)級走兩步,前者有f(n-1)種方法,後者有f(n-2)種方法,所以有f(n)=f(n-1)+f(n-2),還有f(0)=1,f(1)=1.
具體實現:
#include
using
namespace
std;
int f(int n)
int main()
可惜會超時。
改進的方法:動態規劃!
在遞迴思想的基礎下,我們知道存在子問題求解的重複性,運用動規,只需要將子問題求解一次,以後再遇到,直接呼叫,所以我們新建乙個陣列用於儲存子問題的結果:
將陣列元素初始為零,若為新的子問題,我們求解,並把結果賦給對應的陣列元素;這樣當我們再次遇到相同的子問題,就可以直接呼叫了。
具體的實現:
#include
using
namespace
std;
int result[100];
int f(int n)
int main()
一位朋友提供的方法:
原理:
#include
using namespace std;
struct matrix
};static matrix result(1, 0, 1, 0);
matrix operator* (matrix x, matrix y)
void mul(matrix base, int index)
}int main()
mul(base, n - 1);
cout << result.a + result.b << endl;
return
0;}
計蒜客 題庫 爬樓梯
題目 假設你現在正在爬樓梯,樓梯有 n級。每次你只能爬 1級或者 2級,那麼你有多少種方法爬到樓梯的頂部?第一行輸入乙個整數 n 1 n 50 代表樓梯的級數。輸出爬到樓梯頂部的方法總數。樣例輸入5 樣例輸出8 思路 每次只能爬1或者2級,也就是說可以從前n 1 n 2兩級任意一級到達n級,那麼到達...
蒜頭君爬樓梯(1) 計蒜客
目錄 題目 題解 蒜頭君很喜歡爬樓梯,但是蒜頭君腿不夠長,每次蒜頭君最多只能一步跨越兩個階梯。比如他初始在樓底,跨越乙個階梯到達 1號階梯,或者跨越兩個階梯到達 2號階梯。如下圖 為了選出一種最輕鬆的爬樓梯的方式,蒜頭君想把所有不同的到達樓頂的方式都嘗試一遍。對於一共有 n 個階梯的樓梯,蒜頭君一共...
蒜頭君爬樓梯(2) 計蒜客
目錄 題目 題解 1 號階梯,或者跨越 3個樓梯到達 3號階梯。如下圖 為了選出一種最輕鬆的爬樓梯的方式,蒜頭君想把所有不同的到達樓頂的方式都嘗試一遍。對於一共有 n 個階梯的樓梯,蒜頭君一共有多少總方法從樓底到達樓頂。由於最後答案可能很大,輸出最後的答案對 100007 取模的結果。輸入格式 第一...