題目描述
注意:只有碰到地面和管道才算失敗,碰到上頂是可以的。
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...