P1412 經營與開發(DP 倒序)

2021-10-21 18:59:38 字數 1978 閱讀 7921

傳送門

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

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

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

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

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

金錢可以透支。

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

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

10^9

109首先,肯定是dp問題。(而且看資料範圍不可能時o(n

2)

o(n^2)

o(n2))

直覺上,考慮f[i

][j]

f[i][j]

f[i][j

]為走到了第i個位置,且能力值為j的狀態下,收入的最大值。

但是,最直接的,j可能為小數,且可能呈指數增長(c=100時,每次都維修)。空間會爆,肯定不能這麼設計狀態。

退回一步考慮:f[i

]f[i]

f[i]

為走到了第i個位置,收入的最大值。

正序推的話,很明顯有後效性。當前鑽頭能力會影響到後面的過程。

繼續分析,第i個位置是否使用,影響到的是[i+1,n]這一段的初始能力值(後效性)。因此考慮倒推 。(沒想出來)

更正:f[i]表示走過了[i~n],收入的最大值。

如果第i位是資源型,1.使用:f[i]=f[i+1] * (1-0.01*k)+a[i].//影響了[i+1~n](乘乙個係數),並且要加上a[i]

2.不使用:f[i]=f[i+1]

維修型同理。

#include

using

namespace std;

//-----pre_def----

const

double pi =

acos(-

1.0)

;const

int inf =

0x3f3f3f3f

;typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair<

int,

int> pii;

typedef pair<

double

,double

> pdd;

#define fir(i, a, b) for (int i = (a); i <= (b); i++)

#define rif(i, a, b) for (int i = (a); i >= (b); i--)

#define endl '\n'

#define init_h memset(h, -1, sizeof h), idx = 0;

#define lowbit(x) x &(-x)

//---------------

const

int n =

100010

;int n, k, c, w;

pii d[n]

;double f[n]

;void

init()

intmain()

printf

("%.2lf\n"

,f[1

]*w)

;#ifndef online_judge

printf

("run_time = %d ms\n"

,clock()

- starttime)

;#endif

return0;

}

P1412 經營與開發

原題連線 此題作為今天校內測試的t3,由於我太蒟蒻沒有想到要用 dp做,打個o 2n 的搜尋瀟灑暴零qwq 聽了 water lift 的講解並看了不下 10 分鐘的題解後,我終於明白了這個題。其實這個題 dp 還是很容易看出來的 對於每個星球,我們可以選或不選,這不就是標準的 dp 轉移方程嘛?鑽...

洛谷P1412 經營與開發

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

經營與開發 DP

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