luoguP1941福賴皮波德

2022-05-23 01:30:14 字數 1514 閱讀 8715

#include#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=10010

;const

int inf=20172136

;inline

intread()

while(isdigit(ch))

return x*f;

}int

n,m,k;

intx[maxn],y[maxn],l[maxn],h[maxn],ispipe[maxn],z;

int dp[maxn][1010

];int

main()

l[n]=0,h[n]=m+1

;

for(int i=0;i)

for(int i=1;i<=n;i++)

for(int j=0;j<=m;j++)

dp[i][j]=inf;

dp[0][0]=inf;

for(int i=1;i<=m;i++)dp[0][i]=0

;

for(int i=1;i<=n;i++)

dp[i][j]=min(dp[i][j],min(dp[i-1][j-x[i-1]]+1,dp[i][j-x[i-1]]+1

)); }

for(int j=min(1,l[i]+1);j<=min(m-y[i-1],h[i]-1);j++)

dp[i][j]=min(dp[i][j],dp[i-1][j+y[i-1

]]);

for(int j=l[i];j>=1;j--)dp[i][j]=inf;

for(int j=h[i];j<=m;j++)dp[i][j]=inf;

}int ans=inf,ans2=k;

bool flag=0

;

for(int i=n;i>=1;i--)

if(ans2==k)printf("

1\n%d\n

",ans);

else printf("

0\n%d\n

",k);

return0;

}

view code

小細節:

1.可以把每一塊地方弄乙個底端為0頂端為m+1的水管 避免討論 同時要在真正的水管處打tag幫助最後計算不能全部通過的情況

2.小鳥飛到m高處並不會死 只是不能再往上飛了 所以要特判

3.往上飛是完全揹包,往下掉是01揹包 揹包處理完要把不能到達(碰到管子)的點dp值設成inf

4.先考慮往上飛 在考慮往下掉

狀態:dp[i][j]表示飛到[i][j]最少要按幾下螢幕

轉移就是小細節3+小細節2+小細節4

然後...然後就做完了啊

果然坐在雞神旁邊做題是有加成的

小細節細著細著就細完了

luogu P1941 飛揚的小鳥

為了簡化問題,我們對遊戲規則進行了簡化和改編 遊戲介面是乙個長為n 高為 m 的二維平面,其中有k 個管道 忽略管道的寬度 小鳥始終在遊戲介面內移動。小鳥從遊戲介面最左邊任意整數高度位置出發,到達遊戲介面最右邊時,遊戲完成。小鳥每個單位時間沿橫座標方向右移的距離為1 豎直移動的距離由玩家控制。如果點...

Luogu P1941飛揚的小鳥(DP)

我發現現在沒了題解我做普及提高 的題也做不了 更不要說這些提高 難度的 題 此題是乙個二維dp。暴力是三重迴圈ijk,k列舉在i位置上的點選次數。即 for int i 1 i n i for int j 1 j m j for int k 1 j k up i 0 k f i j min f i ...

題解 luogu P1941 飛揚的小鳥

首先想到設f i j 表示到第i行第j列所需要的最少點選螢幕次數。轉移方程為 f i j min 1 k j x 上公升 f i j min j y i 1 m 下降 顯然,下降可以o 1 轉移,主要問題在上公升的轉移。我們將上公升的方程變一下 f i j x i 1 min 這是 f i j x ...