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)