NOIp2014 飛揚的小鳥

2022-05-31 04:48:15 字數 1707 閱讀 8911

傳送門:>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,豎直移動的距離由...