P1412 經營與開發

2022-02-17 15:58:23 字數 1625 閱讀 1845

原題連線  

此題作為今天校內測試的t3,由於我太蒟蒻沒有想到要用 dp做,打個o(2n)的搜尋瀟灑暴零qwq~

聽了 water_lift 的講解並看了不下 10 分鐘的題解後,我終於明白了這個題。

其實這個題 dp 還是很容易看出來的:對於每個星球,我們可以選或不選,這不就是標準的 dp 轉移方程嘛?

鑽頭初始值為 w,隨著經過的星球它的能力值也在不斷改變,也就是說前面的情況會影響到後面的情況,有後效性!怎麼辦?

既然從前往後會影響後面的,那麼我們從後往前不就誰也影響不到了嘛?(真是個小機靈鬼~

考慮到我們採資源時得到的金錢為:a [ i ] * p,鑽頭的能力變為:(1 - 0.01k)* p;修復鑽頭所耗費的金錢為:b [ i ] * p,鑽頭的能力變為:(1 + 0.01c)* p;我們發現我們每一步變換都和 p 有關,這搞得我們很煩,所以我們乾脆把 p 提出來,再將最終答案乘上 p (一開始的初始值 p = w)是不會影響我們的答案的,反而會簡化計算哦。

將 p 提出來後,問題就簡化成:採資源時得到的金錢為:a [ i ],鑽頭的能力變為:1 - 0.01k;修復鑽頭所耗費的金錢為:b [ i ],鑽頭的能力變為:1 + 0.01c;

考慮到鑽頭能力值得每一步變換都會對以後星球的活動造成影響,我們先以資源型星球為例:

假設我們已經在乙個資源型星球採集完資源了,這時候我們得到的金錢就是:a [ i ] * p,鑽頭能力變為:p' = p *(1 - 0.01k);那麼對於以後星球的任何一種活動,我們都要用這個當前鑽頭能力值 p' 去計算活動的貢獻的;假設我們又到了乙個資源型星球來採集資源,我們得到的金錢就是: a [ j ] * p' = a [ j ] * p *(1 - 0.01k),但如果我們不在上乙個 i 星球採集的話(鑽頭沒有損耗),那麼我們當前的這個 j 星球得到的金錢應該就是:a [ j ] * p,對比於上乙個式子,我們可以發現:在某乙個資源型星球採集完資源後,對於後面採集資源的影響就是:資源變成了(1 - 0.01k)倍;

同理對於在維修型星球修鑽頭後,對於以後的採集金錢的活動採集到的金錢都會變成(1 + 0.01c)倍;

這就是狀態轉移方程!

#include#include

#include

using

namespace

std;

intn;

double

k,c,w;

//k是損耗

//c是修復

struct

planet

a[100001

];double f[100001

];int

main()

printf(

"%.2lf

",w*f[1]); //

兩位小數

return0;

}

洛谷P1412 經營與開發

你駕駛著一台帶有鑽頭 初始能力值 w 的飛船,按既定路線依次飛過 n 個星球。星球籠統的分為 2 類 資源型和維修型。p 為鑽頭當前能力值 資源型 含礦物質量 a i 若選擇開採,則得到 a i times p 的金錢,之後鑽頭損耗 k 即 p p times 1 0.01k 維修型 維護費用 b ...

P1412 經營與開發(DP 倒序)

傳送門 你駕駛著一台帶有鑽頭 初始能力值w 的飛船,按既定路線依次飛過n個星球。星球籠統的分為2類 資源型和維修型。p為鑽頭當前能力值 1.資源型 含礦物質量a i 若選擇開採,則得到a i p的金錢,之後鑽頭損耗k 即p p 1 0.01k 2.維修型 維護費用b i 若選擇維修,則支付b i p...

經營與開發

題目 使用maze i 陣列表示在i星球上的價值的大小,對於type 1的星球,就是開採不開採的問題,對於type 2的星球,就是 挖掘不挖掘的問題,如果從前面開始判決,會對後面的判斷造成 影響,所以從後面來,對於第i個星球一定是從第i 1個星球來的 只需選出較大的值代換即可。include inc...