#include#includeview code#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;
}
小細節:
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 ...