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

2021-07-29 17:19:49 字數 1085 閱讀 6232

題目:

我是超連結

題解:

woc!調了一大節課,還對拍樣程(「完全沒有問題啊,拍了一晚上都不帶錯的「),結果看好數量級之後強轉longlong才a了

**:

第一種解法:兩個點之間的距離是(i-j)(i-j-1)/2

方程:f[i]=min(f[j]+(i-j)(i-j-1)/2)+a[i]

#include 

#include

#define ll long long

#define n 1000005

using namespace std;

int n,i;

ll f[n];ll a[n];int

q[n];

ll k(int j)

ll b(int j)

ll y(int i,int j)

bool fg(int x1,int x2,int x3)

int main()

printf("%lld\n",ans);

}

第二種解法:fi表示在i點建守衛塔的費用總和,轉移方程:f[i]=min(f[j]+s[i-1]-s[j]-d[j]*(c[i-1]-c[j]))+a[i]

其中di表示1~i的距離,ci表示1~i的點數,s表示的是d的字首和。

注意這裡第乙個必須選,所以開始的佇列不能為0,應該為1。並且最後乙個可以不選,單獨列舉。

#include 

#include

#define ll long long

#define n 1000005

using namespace std;

ll f[n],a[n],s[n];int c[n],d[n],q[n];

ll k(int j)

ll b(int j)

ll y(int i,int j)

bool cover(int x1,int x2,int x3)

int main()

printf("%lld",ans);

}

BZOJ3156 防禦準備 斜率優化

第一行為乙個整數n表示戰線的總長度。第二行n個整數,第i個整數表示在位置i放置守衛塔的花費ai。共乙個整數,表示最小的戰線花費值。102 3 1 5 4 5 6 3 1 2 181 n 10 6,1 ai 10 9 題解 一眼看出斜率優化dp,先列出方程再說 令f i 表示在i處放置守衛塔,且i左面...

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

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