洛谷P1941 飛揚的小鳥(NOIP 2014)

2021-09-11 19:17:33 字數 1089 閱讀 6923

題目描述

注意:只有碰到地面和管道才算失敗,碰到上頂是可以的。

f[i][j]表示到座標(i,j)的最優解

當j=m時需要特殊判斷,轉移方程為

for(int q=m-x[i-1];q<=m;q++)

其他情況只要保證j-x[i-1]>0就好了

if(j-x[i-1]>0)

y不需要分情況,只要j+y[i-1]<=m就行

if(j+y[i-1]<=m)

f[i][j]=min(f[i][j],f[i-1][j+y[i-1]]);

不能走的地方(管道,地面)設為最大值

#include#include#includeusing namespace std;

const int n=1e4+5,m=1e3+5,maxx=0x3f3f3f3f;

int f[n][m],dn[n],up[n],x[n],y[n],n,m,k;

bool fl[n];

int main()

}for(int j=1;j<=m;j++)

if(j+y[i-1]<=m)

f[i][j]=min(f[i][j],f[i-1][j+y[i-1]]);

for(int j=1;j<=dn[i];j++) f[i][j]=maxx;

for(int j=up[i];j<=m;j++) f[i][j]=maxx;

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

if(f[i][j]!=maxx) now=i;

}int ans=maxx;

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

if(ansans=0;

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

if(fl[i]==1) ans++;

printf("0\n%d",ans);

return 0;

}

洛谷 P1941 飛揚的小鳥 (題解)

這題關於dp 用f i j 表示橫座標為i時高度為j的最少點選次數。用正無窮來表示不可能達到這個狀態。於是我們可以分析出狀態轉移的方式 上公升 完全揹包轉移方式 下降 01揹包轉移方式 超過m變為m 特判 細節詳見 include include include using namespace st...

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