3156 防禦準備 DP 斜率優化

2021-07-10 05:02:43 字數 1245 閱讀 7184

顯然看完題目就知道是dp了 f[

i]表示從

i 個檢查點到最後全都合法的最小花費 g[

i]表示在第

i 個檢查點放置守衛塔的情況下從

i個檢查點到最後全都合法的最小花費 g[

i]=a

[i]+

f[i+

1] f

[i]=

min(

(j−i

)∗(1

+j−i

)2+g

[j])

,j≥i

=min((j

−i)∗

(1+j

−i)2

+a[j

]+f[

j+1]

) 暴力轉移顯然是o(

n2) 的

考慮斜率優化f[

i]=(

j−i)

∗(1+

j−i)

2+a[

j]+f

[j+1

] 各種移項後 a[

j]+f

[j+1

]+j2

+j2=

i∗j+

f[i]

+i−i

22然後令yj

=a[j

]+f[

j+1]

+j2+

j2, xj=

j 寫成斜率的形式yj

=i∗x

j+f[

i]+i

−i22

然後就很明顯了,維護乙個向下的凸包,各種東西都是單調的,直接用乙個佇列維護

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define n 1000006

#define ll long double

using namespace std;

int sc()

long long f[n];

int a[n],q[n],n;

long double y(int k)

long double cal(int k,int j)

int main()

cout<1];

return

0;}

bzoj 3156 防禦準備 斜率優化 DP

傳送門 第一行為乙個整數n表示戰線的總長度。第二行n個整數,第i個整數表示在位置i放置守衛塔的花費ai。共乙個整數,表示最小的戰線花費值。10 2 3 1 5 4 5 6 3 1 2 181 n 10 6,1 ai 10 9 斜率優化 dp 因為最後乙個一定為守衛塔,所以輸入時預處理到過來,接下來說...

BZOJ3156 防禦準備(斜率優化dp)

題目 我是超連結 題解 woc!調了一大節課,還對拍樣程 完全沒有問題啊,拍了一晚上都不帶錯的 結果看好數量級之後強轉longlong才a了 第一種解法 兩個點之間的距離是 i j i j 1 2 方程 f i min f j i j i j 1 2 a i include include defi...

BZOJ3156 防禦準備 斜率優化dp

time limit 10 sec memory limit 512 mb submit 2207 solved 933 submit status discuss 第一行為乙個整數n表示戰線的總長度。第二行n個整數,第i個整數表示在位置i放置守衛塔的花費ai。共乙個整數,表示最小的戰線花費值。10...