1. 程式人生 > >【動態規劃】 Google面試題 爬樓梯問題 斐波那契問題的多種解法

【動態規劃】 Google面試題 爬樓梯問題 斐波那契問題的多種解法

Google 曾詢問應徵者 :有N階樓梯 ,你每次只能爬1或2 階 樓梯;能有多少種方法

對這個問題進行分析:  假設N階樓梯的爬法有A(N)種;由於每次爬1或2階 因此 A(N)= A(N-1)+ A(N-2),並且A(1)= 1.

顯而易見 這是一個 典型的 “斐波那契數列” 問題

程式碼實現如下:

  
int f(int n) {  
  if(n==0 || n==1)  
    return 1;  
  else  
    return f(n-1)+f(n-2);  
}  
int main() {  
  int n;  
  cout << f(n) << endl;  
  return 0;  
}  

遺憾的是 該演算法的運算時間是指數級增長的。

同時這道題的測試點 在於 動態規劃 ,上述的方法就存在一定的缺陷。

動態規劃

當一個問題可以分解成若干重複的子問題時,運用動態規劃的思想:

只需要將子問題求解一次,以後再遇到,直接呼叫,所以我們新建一個數組用於儲存子問題的結果:
將陣列元素初始為零,若為新的子問題,我們求解,並把結果賦給對應的陣列元素;這樣當我們再次遇到相同的子問題,就可以直接呼叫了。
動態規劃實現如下:
#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;
}


提供另一種高深的方法(動態規劃 矩陣連乘解斐波那契問題):


相關推薦

動態規劃 Google試題 樓梯問題 問題的多種解法

Google 曾詢問應徵者 :有N階樓梯 ,你每次只能爬1或2 階 樓梯;能有多少種方法 對這個問題進行分析:  假設N階樓梯的爬法有A(N)種;由於每次爬1或2階 因此 A(N)= A(N-1)+

劍指Offer學習試題9 : 數列

O(n)時間O(1)空間實現: public class Test09 { /** * 寫一個函式,輸入n,求斐波那契(Fibonacci) 數列的第n項 *

劍指offer試題9:數列

題目 寫一個函式,輸入n, 求斐波那契數列的第n項。 遞迴 問題規模為: T(n)=T(n−1)+T(n−2) 如果我們估計一下,讓 T(n−1)=T(n−2) 那麼T(n)=2T(n−1) 那麼O(n)=2n 簡介而不高效 long l

試題10:數列

區別 原創文章 時間 -c 通過 res border cci rgb 斐波那契數指的是這樣一個數列:0、1、1、2、3、5、8、13、21、…… 這個數列從第三個數開始,之後的每一個數都由它前的兩數相加得到。 我們知道在編程中我們可以用遞歸和叠代兩種方法求指定的斐波那契

《劍指offer》試題10:數列

題目一:求斐波那契數列的第n項 寫一個函式,輸入n,求斐波那契(Fibonacci)數列的第n項。斐波那契數列的定義如下: 當n=0時,f(n)=0; 當n=1時,f(n)=1; 當n>1時,f(n)=f(n-1)+f(n-2); 從下往上計算,首先根據 f(0)和 f(

劍指offer試題10:數列(Java 實現)

題目:大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。 思路:使用遞迴會重複計算,效率較低,可以用迴圈自下到上計算。 測試用例: 功能測試:輸入3、5、10 等。 邊界測試:輸入0、1、2 效能測試:輸入較大的數(如40、50、

牛客網線上程式設計專題《劍指offer-試題9》數列

題目連結: 題目描述: 解題思路: (1)遞迴解法 此解法時間複雜度和空間複雜度都很大,我這裡不再給出詳細的程式碼。 (2)動態規劃解法 已經AC的程式碼: import java

劍指offer-試題9:數列

題目一:寫一個函式,輸入n,求斐波那契(Fabonacci)數列的第n項。斐波那契數列的定義如下: 效率很低的解法:遞迴 long long Fibonacci(unsigned n) { if(n <= 0) return 0;

劍指offer——試題10:數列

hid cte pass spl -a 圖片 cst 方法 != 個人答案: 1 #include"iostream" 2 #include"stdio.h" 3 #include"string.h" 4 using namespace std; 5 type

2015 ACM/ICPC Asia Regional Shenyang Online & HDU 5451 Best Solver迴圈節+數論||共軛矩陣冪+廣義降冪

通過一道名為So easy!的共軛構造矩陣冪取模的問題來聯想到這個題,不難發現應該用同樣的套路來進行共軛構造。 但是問題來了,指數過分強大,取模數超小,於是一開始考慮尤拉降冪再矩陣快速冪。資料一大,發現答案全錯!後請教得知無理數無法尤拉降冪。 那麼就只有

[平衡規劃][模擬][前綴和] Jzoj P4724

就是 pac pku ror 一行 100% 數據 道理 std Description DJL為了避免成為一只鹹魚,來找czgj學習Fibonacci數列。通過czgj的諄諄教導,DJL明白了Fibonacci數列是這樣定義的:F(1)=1;F(2)=1;F(n)=

動態規劃樓梯問題

1.問題描述 一個人爬樓梯,每次只能爬1個或兩個臺階,假設有n個臺階,那麼這個人有多少種不同的爬樓梯方法 2.分析 如果n==1,顯然只有從0->1一種方法f(1)=1; 如果n==2,那麼有0->1->2、0->2兩種方法f

Java滾動數組動態規劃UVA - 11137 - Ingenuous Cubrency

得到 lose math scanner light clas details 狀態 ann 滾動數組優化自己畫一下就明白了。 http://blog.csdn.net/u014800748/article/details/45849217 解題思路:本題利用遞推關系解決。

動態規劃 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip

and main spa def esp 動態 return 價值 can 劃分那個序列,沒必要完全覆蓋原序列。對於劃分出來的每個序列,對於某個值v,要麽全都在該序列,要麽全都不在該序列。 一個序列的價值是所有不同的值的異或和。整個的價值是所有劃分出來的序列的價值之和。

動態規劃Codeforces Round #406 (Div. 2) C.Berzerk

[1] space node sca 一個 for 隊列 ber 動態規劃 有向圖博弈問題。 能轉移到一個必敗態的就是必勝態。 能轉移到的全是必勝態的就是必敗態。 轉移的時候可以用隊列維護。 可以看這個 http://www.cnblogs.com/quintessence

動態規劃CDOJ1271 Search gold

mage images sin class png http std ret urn 方格取數。 但由於題意說金幣數<0就死了,就不能繼續轉移。 #include<cstdio> #include<algorithm> #include&l

動態規劃最長公共子序列問題

clas == 搜索 ios for 參考 pan 公式 是否 題目描述: 給定兩個字符串s1s2……sn和t1t2……tn。求出這兩個字符串最長的公共子序列的長度。字符串s1s2……sn的子序列指可以表示為si1si2……sim(i1<i2<……<im)

TarjanLCA動態規劃推導hdu6065 RXD, tree and sequence

and main ack find turn hdu mes ear 高明 劃分出來的每個區間的答案,其實就是連續兩個的lca的最小值。 即5 2 3 4 這個區間的答案是min(dep(lca(5,2)),dep(lca(2,3),dep(lca(3,4))))。 於是d

動態規劃windy數

center log char enter tdi ++ getc windy數 ace BZOJ1026: [SCOI2009]windy數 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7893 Solved: 3

DFS拓撲排序動態規劃Gym - 100642A - Babs' Box Boutique

關鍵字 dag 在一起 ems class std rst ++i box 給你10個箱子,有長寬高,每個箱子你可以決定哪個面朝上擺。把它們摞在一起,邊必須平行,上面的不能突出來,問你最多擺幾個箱子。 3^10枚舉箱子用哪個面。然後按長為第一關鍵字,寬為第二關鍵字,從大到小