題意:敵人有一條直線形狀的鐵路,上面有n個據點,每個據點有對應的值表示他的價值。據點之間通過鐵路相連。
整條鐵路上的戰略價值定義為:∑(
i,j)
1≤in ai
aj,
,其中(i
,j)
表示可以通過鐵路相互到達的兩個據點,ai
,aj 為對應據點的價值。
我們現在能炸毀據點之間的鐵路,但是只能炸掉m段鐵路。希望最小化這些據點的戰略價值。
思路:
問題具有重疊子問題和最優子問題的性質,可以用動態規劃求解。
定義sum[i]為前i個據點的價值和,則su
mi=∑
k=1i
ak=s
umi−
1+ai
. 定義cost[k]為前i個據點的戰略價值,則co
stk=
∑(i,
j)1≤
ikaia
j=∑(
i,j)
1≤ik−1a
iaj+
∑j=1
jjak=
cost
k−1+
ak∗s
umk−
1 定義dp[i][j]為用i次爆破前j個據點間的道路,且最後一次爆破為第j個據點的右邊的鐵路.
則狀態轉移方程為: dp
[i][
j]=m
in(d
p[i−
1][k
]+co
stj−
cost
k−su
mk(s
umj−
sumk
))
這樣的時間複雜度是θ(
mn 2
) ,也會超時。
因為注意到cost[i],sum[i]遞增,轉移方程中出現了很多二次項,啟發我們能否表示成斜率,從而利用斜率優化。
將上面的方程變形得: dp
[i][
j]=m
in(d
p[i−
1][k
]−co
stk−
sumj
sumk
+sum
2k)+
cost
j 設t
<
k,如果k比t在j處更優,則 dp
[i−1
][k]
−cos
tk−s
umjs
umk+
sum2
k≤dp
[i−1
][t]
−cos
tt−s
umjs
umt+
sum2
t 變形得: (d
p[i−
1][k
]+su
m2k−
cost
k)−(
dp[i
−1][
t]+s
um2t
−cos
tt)s
umk−
sumt
≤sum
j 令: g(t
,k)=
(dp[
i−1]
[k]+
sum2
k−co
stk)
−(dp
[i−1
][t]
+sum
2t−c
ostt
)sum
k−su
mt 即
g(t,
k)≤s
umj
同樣,我們可以證明: 1.g
(t,k
)≤su
mj≤s
uml(
j≤l)
,則k在後面的幾項都比t優,t可以刪除。
2.如果g(
t,k)
≥g(k
,j)
,k一定不是最優解,從而可以刪除。
這樣,我們就可以用單調佇列進行優化了。
**如下:
#include
#include
#include
using namespace std;
const int max = 1010;
int a[max],sum[max],cost[max];
intq[max],head,tail;
int dp[max][max];
int main(void)
for(int i = 1 ; i <= n; ++i)
dp[i][0] = cost[i],dp[i][i-1] = 0;
for(int j = 1; j <= m; ++j)
int k = q[head];
dp[i][j] = dp[k][j-1] + cost[i] - cost[k] - sum[k] * (sum[i] - sum[k]);
int p3 = i;
int x3 = sum[p3];
int y3 = dp[p3][j-1] - cost[p3] + x3*x3;
while(head + 1
< tail)
q[tail++] = i;}}
printf("%d\n",dp[n][m]);
}return
0;}
HDU 2829 Lawrence dp 斜率優化
題意 一段直線上有n個點,每個點有乙隻價值,一條鐵路的價值等於每兩個點 可以直接或者間接相連,就是聯通路上是否有炸彈把路給炸了 積的和 思路 斜率優化 dp i j 為前i個點,炸j個線段能破壞的最大值 沒優化前的狀態轉移方程為dp i x max x 1 設計算點i時,j比k的值優,dp k x ...
HDU 3480 Division 斜率優化DP
題意 現在有n個元素的集合s。把集合s劃分成m個子集,每個子集的花費為集合中最大和最小元素的差的平方。求如何劃分,才能總的代價最小。思路 首先要注意到,因為集合中的元素具有無序性,我們只需知道集合中最大和最小的元素就能算出代價,也能把集合劃分出來。所以,我們把所有元素進行排序,這樣,最小的元素和最大...
Hdu 2993斜率優化
這題是斜率優化的入門題 數形結合在資訊學競賽中的應用中講得很好,這是其中的例二 在此標記個人理解上覺得重要的地方 首先這題求max即看成求最大斜率.include include include using namespace std typedef long long ll const int n...