經營與開發 DP

2021-08-09 17:31:41 字數 2318 閱讀 3917

問題描述

你駕駛著一台帶有鑽頭(初始能力值w)的飛船,按既定路線依次飛過n個星球。

星球籠統的分為2類:資源型和維修型。(p為鑽頭當前能力值)

資源型:含礦物質量a[i],若選擇開採,則得到a[i]p的金錢,之後鑽頭損耗k%,即p=p(1-0.01k)

維修型:維護費用b[i],若選擇維修,則支付b[i]p的金錢,之後鑽頭修復c%,即p=p(1+0.01c)

注:維修後鑽頭的能力值可以超過初始值(你可以認為是翻修+公升級)

請作為艦長的你仔細抉擇以最大化收入。

輸入格式

第一行4個整數n,k,c,w。

以下n行,每行2個整數type,x。

type為1則代表其為資源型星球,x為其礦物質含量a[i];

type為2則代表其為維修型星球,x為其維護費用b[i];

輸出格式

乙個實數(保留2位小數),表示最大的收入。

樣例輸入

5 50 50 10

1 10

1 20

2 10

2 20

1 30

樣例輸出

375.00

資料範圍

對於30%的資料 n<=100

另有20%的資料 n<=1000;k=100

對於100%的資料 n<=100000; 0<=k,c,w,a[i],b[i]<=100;保證答案不超過10^9

首先說一下o(

n3) 的暴力做法:定義f

[i][

j][k

] 表示討論完第i個數,維修j次,開採k次所能得到的最大收入。那麼顯然有狀態轉移方程:f[

i][j

][k]

=max

(f[i

−1][

j][k

],f[

i−1]

[j][

k−1]

+a[i

]∗p)

,typ

e[i]

=1 f

[i][

j][k

]=ma

x(f[

i−1]

[j][

k],f

[i−1

][j−

1][k

]−b[

i]∗p

),ty

pe[i

]=2

其中p為該狀態下的鑽頭能力值。f[

0][0

][0]

=0。然而這樣只能得30分。考慮o(

n)或者是o(

nlog

n)的做法。

事實上,這道題的正解有點費用提前計算的感覺。其實也是乙個常見的思路:如果正著討論不夠優秀或者難以討論,考慮倒著討論。注意到如果把答案列式計算下來,可以發現乙個乘法分配率的形式,因為每次操作對

p 的改變都是乘上乙個數。所以,如果定義f[

i]為處理完區間[i

,n] 的星球得到的最大收入,那麼有:f[

i]=m

ax(f

[i+1

],(1

−0.01k)

∗f[i

+1]+

a[i]

),ty

pe[i

]=1

f[i]

=max

(f[i

+1],

(1+0.01c)

∗f[i

+1]−

b[i]

),ty

pe[i

]=2

最後的答案就是w∗

f[1]

,時間複雜度o(

n)。

#include

#include

#define maxn 100005

using

namespace

std;

int n,ty[maxn];

double k,c,w,v[maxn],f[maxn];

int main()

printf("%.2lf",w*f[1]);

}

經營與開發

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

經營與開發

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

經營與開發

時間限制 1 sec 記憶體限制 128 mb 題目描述 4x概念體系,是指在pc戰略遊戲中一種相當普及和成熟的系統概念,得名自4個同樣以 ex 為開頭的英語單詞。explore 探索 expand 拓張與發展 exploit 經營與開發 exterminate 征服 維基百科 今次我們著重考慮ex...