1. 程式人生 > 其它 >AcWing 734 能量石

AcWing 734 能量石

題目傳送門

一、貪心(微擾) + \(dp\)

這道題還是比較難的,前置知識:

貪心的微擾(鄰項交換)證法,例題:國王遊戲耍雜技的牛

貪心將問題轉化:

發現有可能存在最優解的某些寶石的貢獻為\(0\),我們剔除了這些寶石。

假設最優解的能量石排列長度為\(k(1<=k<=n)\) 因為去掉了那些沒有貢獻的寶石,位置為:

\(a1,a2,a3…aka1,a2,a3…ak\)

那麼對於任意兩個位置\(i=a_l,j=a_l+1\)(\(1<=l<k\)),交換後兩個寶石的貢獻總和不會變得更大,即(假設之前的總時間為\(t\)):

\(E_i−t∗L_i+E_j−(t+S_i)∗L_j>=E_j−t∗L_j+E_i−(t+S_j)∗L_i\)

整理後:

\(S_i∗L_j<=S_j∗L_i\)

我們可以把跟\(i\)有關的放到一邊,調整一下:

\(S_i/L_i<=S_j/L_j\)

這樣,我們只要以如上條件作為寶石間排序的條件,進行一次\(sort\)

因為對於其他形式的放置規律,必然可以通過交換滿足SiLi>SjLjSiLi>SjLj的相鄰的兩項來得到更小值。

那麼最優解的座標(新的座標)一定滿足:

ai<a2<a3…<akai<a2<a3…<ak
dp
那麼,我們只要搞個0101揹包,SiSi作為費用,max(0,Ei−(t−Si)∗Li)max(0,Ei−(t−Si)∗Li) 作為價值 (tt為當前花費時長)。

f[t]f[t] 表示當前正好花tt時間得到的最大能量。

狀態轉移方程:

f[t]=max(f[t],f[t−Si]+max(0,Ei−(t−Si)∗Li))f[t]=max(f[t],f[t−Si]+max(0,Ei−(t−Si)∗Li))
由於我們揹包放物品(寶石)的順序是座標從11到nn的,所以一定能列舉到最優解。

初始狀態:f[0]=0f[0]=0,其餘為負無窮

答案:max(f[i])(1<=i<=∑ni=1si)