洛谷 P1244 青蛙過河

2022-04-05 04:33:13 字數 1247 閱讀 3962

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

思路:遞推(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;

#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,...