傳送門:>here
<
很經典的題目,題意有些難描述,見原題。這是乙個多階段決策問題的模型,那麼可以考慮$dp$。對於每乙個位置$dp_$,可以是下落到達的,從$dp_$轉移來。可以是跳上來的,從$dp_(k \geq 1)$轉移來。
這兩個方程就是很標準的揹包方程。前者是01揹包,後者是完全揹包。於是我們就想到了完全揹包的優化。就在這裡是個難點,題目考察了對完全揹包優化的理解。
完全揹包為什麼可以不用列舉$k$?優化,其實就是盡量少作重複工作,盡量不做無用工作。在完全揹包中,對於$dp_$可以從$dp_(k \geq 0)$轉移而來,而$dp_$是從$dp_(k \geq 0)$轉移而來的。這之間就有重複工作了。於是我們直接把$dp_$繼承下來,在加上這一輪的轉移就行了。
這裡是一樣的。只不過$k$的取值不同,因此繼承還是繼承,只不過這一輪的轉移改變了。而很多人完全揹包的滾動版本打多了,忽略了完全揹包的滾動版本也是有這一輪自己的轉移的,只不過這一輪是繼承$dp_$,而因為滾動,這個值本身就在那裡,**裡就不寫了。
這道題還加進了狀態不存在的情況。我們不能因為某一狀態不存在就不去做了,因為後面的有可能要從這個位置轉移。處理方法是一列做完後手動去除不合法狀態。另外,天花板的情況需要暴力轉移。
$code$
/*dennyqi 2019
*/#include
#include
#include
#include
#include
const
int n = 10010
;const
int p = 998244353
;const
int inf = 0x3f3f3f3f
;inline
int mul(const
int& a, const
int& b)
inline
int add(const
int& a, const
int& b)
inline
int sub(const
int& a, const
int& b)
inline
intread()
int n,m,pp,ans1,ans2,p,cnt,x[n],y[n],l[n],h[n],cp[n],dp[n][1000
];int
main()
for(int i = 1; i <= n; ++i)
for(int i = 1; i <= pp; ++i)
for(int i = 1; i <= n; ++i)
}for(int j = 1; j < m; ++j)
}dp[i][m] =inf;
if(i == 1
)else
}for(int j = 1; j <= l[i]; ++j)
for(int j = h[i]; j <= m; ++j)
for(int j = 1; j <= m; ++j)}}
if(ans2 }
printf(
"%d\n
",cnt);
}else
printf(
"%d\n
",ans1);
}return0;
}
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,豎直移動的距離由...