顯然看完題目就知道是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...