【BZOJ-3156】防御准备 DP + 斜率优化
生活随笔
收集整理的這篇文章主要介紹了
【BZOJ-3156】防御准备 DP + 斜率优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
3156: 防御準備
Time Limit:?10 Sec??Memory Limit:?512 MBSubmit:?951??Solved:?446
[Submit][Status][Discuss]
Description
Input
第一行為一個整數N表示戰線的總長度。
第二行N個整數,第i個整數表示在位置i放置守衛塔的花費Ai。
Output
共一個整數,表示最小的戰線花費值。
Sample Input
102 3 1 5 4 5 6 3 1 2
Sample Output
18HINT
1<=N<=10^6,1<=Ai<=10^9
Source
Katharon+#1
Solution
斜率優化DP
方案由后面的轉移? 翻轉序列即可..
然后就是轉移方程 $dp[i]=min(dp[i],dp[j]+sum[i-1]-sum[j]-(i-j-1)*j+A[i]$
然后斜率優化一下,比較的裸,然后即可
值得注意的地方:
轉移的時候,$i=1$提前的處理出來..
在計算答案的時候,注意加long long否則會WA成狗..
Code
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int read() {int x=0,f=1; char ch=getchar();while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f; } #define maxn 1000100 int n,A[maxn]; int que[maxn],l,r; long long dp[maxn],sumid[maxn],ans; double slope(long long i,long long j) {return (double)(dp[i]-dp[j]-sumid[i]+sumid[j]+i-j+i*i-j*j)/(double)(i-j);} int main() {n=read(); ans=(long long)1<<60;for (int i=n; i>=1; i--) A[i]=read();for (int i=1; i<=n; i++) sumid[i]=sumid[i-1]+i;dp[1]=A[1]; que[1]=1; l=r=1;for (int tmp,i=2; i<=n; i++){while (l<r && slope(que[l],que[l+1])<i) l++;tmp=que[l];dp[i]=dp[tmp]+sumid[i-1]-sumid[tmp]-(i-tmp-1)*tmp+A[i];while (l<r && slope(que[r],i)<slope(que[r-1],que[r])) r--;que[++r]=i;}for (int i=1; i<=n; i++) ans=min(ans,dp[i]+sumid[n]-sumid[i]-(long long)(n-i)*i);printf("%lld\n",ans);return 0; }上文所述WA成狗...MDZZ
轉載于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5388392.html
總結
以上是生活随笔為你收集整理的【BZOJ-3156】防御准备 DP + 斜率优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些javascript免费中文书籍
- 下一篇: bzoj-2957 楼房重建