傳送門
你駕駛著一台帶有鑽頭(初始能力值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的金錢...