有一條河,左邊乙個石墩(a區)上有編號為1,2,3,4,…,n的n只青蛙,河中有k個荷葉(c區),還有h個石墩(d區),右邊有乙個石墩(b區),如下圖所示。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
輸出格式:
乙個整數,表示最多能有多少只青蛙可以根據以上規則順利過河。
輸入樣例#1: 複製
2 3輸出樣例#1: 複製
16首先,青蛙只能往前跳,不能往後跳,而且只能12345這樣排下去,所以要想使最多的青蛙到達對岸,只需使編號最大的青蛙首先跳到對岸(否則編號更大的青蛙就跳不過去了)。思路:遞推(dp)
然後,要想使編號最大的青蛙首先跳到對岸,只需讓河面上承載最多的青蛙。而荷葉上只能承載乙隻青蛙,所以需要讓青蛙盡可能多地疊到石墩上。
接下來便是核心內容:(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;
#include#include#include
#include
using
namespace
std;
inth,k,sum;
int f[10000
];int
main()
cout
<
}
P1244 青蛙過河
p1244 青蛙過河 noi2000 主要思想 數學歸納法 遞推 壓位高精度 化歸 理解能力和找規律的能力 題意再述 1.青蛙從上到下必須連續遞增或者下面是石墩 而不能是 1 1 2 3 3 4 而且每時每刻都要滿足這個條件 2.左岸和右岸都是石堆 公式推導過程 k 0h 0 s 1 h 1 s 2...
luogu整理 P1244 青蛙過河
這個題太騷了。有一條河,左邊乙個石墩 a 區 上有編號為 1,2,ldots n 的 n 只青蛙,河中有 k 個荷葉 c 區 還有 h 個石墩 d 區 右邊有乙個石墩 b 區 如下圖所示。n 只青蛙要過河 從左岸石墩 a 到右岸石墩 b 規則為 你的任務是對於給出的 h,k 計算並輸出最多能有多少只...
洛谷 P1052 過河
題目 過河 思路 因為l的值太大,而實際有石子的地方卻並不多,所以要先進行離散化。即將每個石子之間的差距都控制在剛好比t大一點的位置,這樣就不會影響最終結果。令f i 表示跳過前i個位置需要最少踩得石頭數量,轉移方程f i min f i j cnt i f i j s,t 注意最後的輸出是min,...