藍橋杯 第39級臺階 遞推動態規劃

網上答案寫的都和狗屎一樣。看不下去。自己寫一個
描述如下
小明剛剛看完電影《第39級臺階》,離開電影院的時候,他數了數禮堂前的臺階數,恰好是39級!

站在臺階前,他突然又想着一個問題:

如果我每一步只能邁上1個或2個臺階。先邁左腳,然後左右交替,最後一步是邁右腳,也就是說一共要走偶數步。
那麼,上完39級臺階,有多少種不同的上法呢?


請你利用計算機的優勢,幫助小明尋找答案。

這明顯是一道動態規劃問題。 動態規劃嘛。我們可以想一想。要走到第n層臺階,那麼是不是根據條件可以知道是從n-1層與n-2層走過來的呢?

這道題與臺階的Fib數列區別是,從n-1與n-2走過來的步子,肯定與當前臺階到達的步子是相反的。
我們可以把問題抽象成轉換爲 第n階樓梯用右腳到達的次數=n-1階樓梯左腳到達的次數+n-2階樓梯左腳到達的次數

上面這個就是轉移方程了,因此可以用int [][] dp=new int[n][2];來表示每一層到達的步子與左右腳。
設dp[k][1]爲右腳 dp[k][0]爲左腳。
首先是邊界條件,因爲要寫出遞推式,要先把前兩層手工處理了。

//0視爲第一層,沒有-1層
dp[0][1]=0; //右腳到達,不可能,因爲先出左腳
dp[0][0]=1;//左腳到達這一層。
dp[1][1]=1;//上一層左腳到達,所以這次變右腳前進一步.到達了[1][1]這個狀態,所以爲1
dp[1][0]=1;//從開始步用左腳前進兩步,到達了[1][0]=1 這個狀態
//複雜度On,比遞歸不知道高到哪裏去了,還不會stackoverflow
	for(int i =2;i<layer;i++) {
			//1爲右腳
			dp[i][1]=dp[i-1][0]+dp[i-2][0];
			dp[i][0]=dp[i-1][1]+dp[i-2][1];
		}
	return dp[layer-1][1];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章