【递归与递推】青蛙过河
生活随笔
收集整理的這篇文章主要介紹了
【递归与递推】青蛙过河
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
有一條河,左邊一個石墩(A區)上有編號為1,2,3,4,…,n的n只青蛙,河中有k個荷葉(C區),還有h個石墩(D區),右邊有一個石墩(B區),如下圖2—5所示。n只青蛙要過河(從左岸石墩A到右岸石墩B),規則為:(1)石墩上可以承受任意多只青蛙,荷葉只能承受一只青蛙(不論大小);
(2)青蛙可以:A→B(表示可以從A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D;
(3)當一個石墩上有多只青蛙時,則上面的青蛙只能跳到比它大1號的青蛙上面。
你的任務是對于給出的h,k,計算并輸出最多能有多少只青蛙可以根據以上規則順利過河?
輸入
一行兩個整數h和k,分別表示k片荷葉和h個石墩輸出
輸出最多能有多少只青蛙可以根據以上規則順利過河樣例輸入
2 3樣例輸出
16?
思路:遞推(dp)首先,青蛙只能往前跳,不能往后跳,而且只能12345這樣排下去,所以要想使最多的青蛙到達對岸,只需使編號最大的青蛙首先跳到對岸(否則編號更大的青蛙就跳不過去了)。
然后,要想使編號最大的青蛙首先跳到對岸,只需讓河面上承載最多的青蛙。而荷葉上只能承載一只青蛙,所以需要讓青蛙盡可能多地疊到石墩上。
接下來便是核心內容:(f[i]表示當有k個荷葉,i個石墩時過河青蛙的最大數量)
1、若有k個荷葉,沒有石墩,則最多有k+1個青蛙。所以f[0]=k+1(不需要解釋了吧);
2、若有k個荷葉,1個石墩,則只需要使石墩上承載最多的青蛙。進一步分析,我們只需要將石墩當做對岸,這樣就變成1的情況了。所以f[1]=f[0]+k+1;
3、若有k個荷葉,2個石墩,則需要先讓石墩1作為對岸,疊完后再讓石墩2作為對岸。所以f[2]=f[1]+f[0]+k+1;
繼續往下推理,得到狀態轉移方程:f[h]=f[0]+f[1]+f[2]+……+f[h-1]+k+1;
代碼:
1 #include <iostream> 2 #include <bits/stdc++.h> 3 using namespace std; 4 int n,m,sum; 5 int a[10000]; 6 int main() 7 { 8 scanf("%d%d",&n,&m); 9 a[0]=m+1; 10 sum=a[0]; 11 for(int i=1;i<=n;i++) 12 { 13 a[i]=sum; 14 sum+=a[i]; 15 } 16 cout << sum << endl; 17 return 0; 18 } View Code?
轉載于:https://www.cnblogs.com/SoulSecret/p/8447457.html
總結
以上是生活随笔為你收集整理的【递归与递推】青蛙过河的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hihocoder 1580 Matri
- 下一篇: point-position2修改版