HDU 2829 Lawrence 斜率優化DP

2021-06-28 19:45:43 字數 2678 閱讀 3696

題意:敵人有一條直線形狀的鐵路,上面有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...