令f[i][j]表示飛翔到(i,j)的最小點選次數
f[i][j]=min(f[i-1][j-k*x[i-1]+k,f[i-1][j+y[i-1]]
這樣做複雜度o(n^2m)
考慮優化這個過程,先考慮上公升的情況,則f[i][j]有兩類決策轉移:
1.f[i][j]=f[i-1][j-x[i-1]]
2.f[i][j]=min(f[i-1][j-k*x[i-1]]+k)
第二類的答案已經被記入f[i][j-x[i-1]]中,這樣可以得到新的轉移方程:f[i][j]=min(f[i][j],min(f[i−1][j−x[i−1]],f[i][j−y[i−1]])+1)
根據題目要求,轉移時要先處理上公升,後處理下降
#include#include#include#include#include#includeusing namespace std;struct ios
template inline ios & operator >> (_tp&x)
for(x=0;isdigit(ch);ch=gc())x=x*10+(ch^'0');
sgn&&(x=-x); return *this;
}//orz 浮塵ii*
}io;
int n,m,k,ans=1<<30,x[10005],y[10005],l[10005],r[10005],f[10005][2005],xx,yy,zz;
bool ok[10005];
int main()
for (register int i=1;i<=k;++i)
for (register int i=1;i<=m;++i) f[0][i]=0;
for (register int i=1;i<=n;++i)
} }return 0;
}
NOIP2014 飛揚的小鳥
題目 分析 乙個揹包問題。i,j 是跳上來的情況時 可以由 i,j k 得到,則問題得到解決。注意 f陣列要先進行上公升操作,再進行下降操作,否則 i,j k 有可能是下降得到的,從而得到錯解 吸取我的教訓吧,調了好長時間 include include using namespace std co...
NOIP2014飛揚的小鳥
天哪細節問題調了乙個鐘,手速不夠快思路不夠清晰寫了乙個鐘,感覺一道第三題就要花掉我2個鐘那我比賽的時候腫麼辦qaq 說下這道題,首先純暴力,70分到手,然後我們把01揹包的轉移變成有上界的完全揹包,還有一些特殊情況特殊轉移,還是比較好看的,去年比賽不知是電腦問題還是什麼一直沒輸出,蠢到家了然後這題爆...
NOIP2014 飛揚的小鳥
傳送門 為了簡化問題,我們對遊戲規則進行了簡化和改編 1.遊戲介面是乙個長為n,高 為m的二維平面,其中有k個管道 忽略管道的寬度 2.小鳥始終在遊戲介面內移動。小鳥從遊戲介面最左邊任意整數高度位置出發,到達遊戲介面最右邊時,遊戲完成。3.小鳥每個單位時間沿橫座標方向右移的距離為1,豎直移動的距離由...