【递归与递推】青蛙过河
生活随笔
收集整理的這篇文章主要介紹了
【递归与递推】青蛙过河
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
有一條河,左邊一個(gè)石墩(A區(qū))上有編號(hào)為1,2,3,4,…,n的n只青蛙,河中有k個(gè)荷葉(C區(qū)),還有h個(gè)石墩(D區(qū)),右邊有一個(gè)石墩(B區(qū)),如下圖2—5所示。n只青蛙要過河(從左岸石墩A到右岸石墩B),規(guī)則為:(1)石墩上可以承受任意多只青蛙,荷葉只能承受一只青蛙(不論大小);
(2)青蛙可以:A→B(表示可以從A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D;
(3)當(dāng)一個(gè)石墩上有多只青蛙時(shí),則上面的青蛙只能跳到比它大1號(hào)的青蛙上面。
你的任務(wù)是對于給出的h,k,計(jì)算并輸出最多能有多少只青蛙可以根據(jù)以上規(guī)則順利過河?
輸入
一行兩個(gè)整數(shù)h和k,分別表示k片荷葉和h個(gè)石墩輸出
輸出最多能有多少只青蛙可以根據(jù)以上規(guī)則順利過河樣例輸入
2 3樣例輸出
16?
思路:遞推(dp)首先,青蛙只能往前跳,不能往后跳,而且只能12345這樣排下去,所以要想使最多的青蛙到達(dá)對岸,只需使編號(hào)最大的青蛙首先跳到對岸(否則編號(hào)更大的青蛙就跳不過去了)。
然后,要想使編號(hào)最大的青蛙首先跳到對岸,只需讓河面上承載最多的青蛙。而荷葉上只能承載一只青蛙,所以需要讓青蛙盡可能多地疊到石墩上。
接下來便是核心內(nèi)容:(f[i]表示當(dāng)有k個(gè)荷葉,i個(gè)石墩時(shí)過河青蛙的最大數(shù)量)
1、若有k個(gè)荷葉,沒有石墩,則最多有k+1個(gè)青蛙。所以f[0]=k+1(不需要解釋了吧);
2、若有k個(gè)荷葉,1個(gè)石墩,則只需要使石墩上承載最多的青蛙。進(jìn)一步分析,我們只需要將石墩當(dāng)做對岸,這樣就變成1的情況了。所以f[1]=f[0]+k+1;
3、若有k個(gè)荷葉,2個(gè)石墩,則需要先讓石墩1作為對岸,疊完后再讓石墩2作為對岸。所以f[2]=f[1]+f[0]+k+1;
繼續(xù)往下推理,得到狀態(tài)轉(zhuǎn)移方程: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?
轉(zhuǎn)載于:https://www.cnblogs.com/SoulSecret/p/8447457.html
總結(jié)
以上是生活随笔為你收集整理的【递归与递推】青蛙过河的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hihocoder 1580 Matri
- 下一篇: point-position2修改版