日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【递归与递推】青蛙过河

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【递归与递推】青蛙过河 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

有一條河,左邊一個石墩(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

總結

以上是生活随笔為你收集整理的【递归与递推】青蛙过河的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。