P1941 飛揚的小鳥

2022-05-19 18:43:09 字數 1177 閱讀 3524

傳送門

很顯然的dp

我們設 f [ i ] [ j ] 表示在位置 i , j 時需要的最少的點選次數

考慮不點選的影響 f [ i ] [ j ] = f [ i-1 ] [ j + y [ i ] ]

如果點選 f [ i ] [ j ] = f [ i-1 ] [ j - x [ i ] ] +1 ,但是由於同一時間內可以點選多次,所以 f [ i ] [ j ] 可以從同一橫座標的位置轉移過來

即  f [ i ] [ j ] = min(f [ i-1 ] [ j - x [ i ] ],f [ i ] [ j - x [ i ] ])+1(for迴圈時 j 從小到大)

注意題目的乙個小坑

到最上面不會死也不會再上公升

所以要特殊考慮

一定要注意不能直接把管子的位置判死,因為這個一直wa

因為我們轉移有從同一橫座標轉移(表示點了多次),所以先全部轉完了再把管道位置的值弄成inf

大概就這樣,具體實現看**..

#include#include

#include

#include

#include

using

namespace

std;

inline

intread()

while(ch>='

0'&&ch<='

9')

return x*f;

}const

int n=10007,m=1007,inf=2e9+7

;int u[n],d[n],a[n],b[n],n,m,t;//

u[i],d[i]分別表示橫座標i的管道的上下部分,a[i],b[i]表示橫座標i的上公升下降距離

intf[n][m],ans;

intmain()

//判斷能否到達終點,如果當前橫座標任意位置都無法到達說明最多到此處

}

if(pos)//

如果無法到達

//否則

ans=inf;

for(int i=1;i<=m;i++) ans=min(ans,f[n][i]);//

計算最少步數

printf("

1\n%d

",ans);

return0;

}

P1941 飛揚的小鳥

定義dp i j 表示走到座標 i,j 時的最小點按次數。考慮遞推關係,能走到座標 i,j 一種情況是從前乙個位置下降上公升的轉移是乙個完全揹包,下降是01揹包。include using namespace std define ll long long define inf 0x3f3f3f d...

P1941 飛揚的小鳥

miku 定義 f 為到達 i,j 的最小代價 然後對於從下往上,因為可以點無數次,是個完全揹包,從上往下就一次,01揹包,飛到天花板上的,拽下來 水管特判 include include includeusing namespace std const int maxn 10005 int n,m...

P1941 飛揚的小鳥

動態規劃,設 f i j 表示小鳥到達座標 i j 所要點選螢幕的最少次數,如果小鳥無法到達 i j 則 f i j inf。轉移,考慮小鳥上公升,和下降兩種狀態。因為,在乙個點上公升次數不限,下降只有一次。所以上公升可以用 完全揹包 的狀態轉移,下降用 01揹包 轉移。特判,當小鳥到達頂上 m 時...