1. 程式人生 > >[BZOJ4518][Sdoi2016]征途(斜率優化dp)

[BZOJ4518][Sdoi2016]征途(斜率優化dp)

題目描述

傳送門

題解

題目讓求vm2別有用心啊
ai表示每天走的路程和,si表示前i段路程的字首和
ans=m21m[i=1m(aisnm)2]
=m(i=1ma2i+s2nm2sni=1maim)
=mi=1mai2sn2
所以實際上就是將n個數劃分成m個部分然後讓這些部分的平方和儘量小
f(i,j)表示前j個數劃分成i個部分的答案
那麼f(i,j)=min{f(i1,k)+(sjsk)2},1k<j
那麼i那一維不管,剩餘展開
f(i,j)=min{2sksj+f(i1,k)+s2k+s2j}
這樣就可以斜率優化了

程式碼

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define LL long long

const int max_n=3e3+5;
const LL INF=1e18;

int n,m,head,tail;
int a[max_n],s[max_n],q[max_n];
LL f[max_n],g[max_n];
LL xba,ans;

inline LL K(int k){return -2*s[k];}
inline LL B(int k){return
g[k]+s[k]*s[k];} inline LL Y(int j,int k){return K(k)*s[j]+B(k);} inline bool cmp(int x1,int x2,int x3){ LL w1=(K(x1)-K(x3))*(B(x2)-B(x1)); LL w2=(K(x1)-K(x2))*(B(x3)-B(x1)); return w1>=w2; } int main(){ scanf("%d%d",&n,&m); ans=INF; for (int i=1;i<=n;++i) scanf("%d
"
,&a[i]),s[i]=s[i-1]+a[i]; for (int i=1;i<=n;++i) g[i]=INF;g[0]=0; for (int i=1;i<=m;++i){ head=tail=0; for (int j=0;j<=n;++j){ while (head<tail&&Y(j,q[head])>=Y(j,q[head+1])) head++; f[j]=Y(j,q[head])+s[j]*s[j]; while (head<tail&&cmp(j,q[tail-1],q[tail])) tail--; q[++tail]=j; } ans=min(ans,f[n]); for (int j=0;j<=n;++j) g[j]=f[j]; } printf("%lld\n",(LL)ans*m-(LL)s[n]*s[n]); }

總結

時刻要注意斜率單調這一性質。

相關推薦

[BZOJ4518][Sdoi2016]征途斜率優化dp

題目描述 傳送門 題解 題目讓求v∗m2別有用心啊 令ai表示每天走的路程和,si表示前i段路程的字首和 ans=m2∗1m[∑i=1m(ai−snm)2] =m(∑i=1ma2i+s2

bzoj4518 [Sdoi2016]征途斜率優化dp

分析: 斜率優化dp 很多人做斜率優化的時候喜歡畫出斜率 我偏向畫柿子 題目就是把若干個元素分成m份, 每一份的價值是該組中的元素之和 使得m組數的方差最小 平均數:x=(sum[1]+sum[2]+..+sum[m])/m //sum是

洛谷4072 SDOI2016征途 斜率優化+dp

首先根據題目中給的要求,推一下方差的柿子。 \[v\times m^2 = m\times \sum x^2 - 2 \times sum \times sum +sum*sum\] 所以\(ans = v*m^2 = m\times \sum x^2 - sum*sum\) 那我們實際上就是最大化平方

BZOJ4518】【SDOI2016征途斜率優化DP

Description Pine開始了從S地到T地的征途。 從S地到T地的路可以劃分成n段,相鄰兩段路的分界點設有休息站。 Pine計劃用m天到達T地。除第m天外,每一天晚上Pine都必須在休息站

洛谷P4072 [SDOI2016]征途斜率優化

傳送門 tps double nbsp ble esp 就是 int turn 傳送門 推式子(快哭了……)$$s^2*m^2=\sum _{i=1}^m (x_i-\bar{x})^2$$ $$s^2*m^2=m*\sum _{i=1

【洛谷 P4072】 [SDOI2016]征途斜率優化

ret int 斜率 clas mem print play double memset 好久沒寫斜率優化板子都忘了, 硬是交了十幾遍。。 推一下柿子就能得到答案為 \[m*\sum x^2-(\sum x)^2\] 後面是個定值,前面簡單dp,斜率優化一下就行了。 \(f

HDU 3507 Print Article斜率優化DP

hdu clas 進行 維護 直接 元素 string 單調性 ons 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 題目大意:概題意就是要輸出N個數字a[N],輸出的時候可以連續連續的輸出,每連續輸出一串,它的費

USACO16FEB 再探圓形穀倉斜率優化DP

題意 n n n 個順時針排列的牛棚,可以開

【洛谷3648】[APIO2014] 序列分割斜率優化DP

點此看題面 大致題意: 你可以對一個序列進行\(k\)次分割,每次得分為兩個塊元素和的乘積,求總得分的最大值。 區間\(DPor\)斜率優化\(DP\) 這題目第一眼看上去感覺很明顯是區間\(DP\)。 但是,一看資料範圍,\(n\le100000\),這是要上天的節奏! 不過,再看\(m\le

BZOJ3437: 小P的牧場斜率優化DP

3437: 小P的牧場 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1914  Solved: 1046[Submit][Status][Discuss] Desc

2018.09.29 bzoj3675: [Apio2014]序列分割斜率優化dp

傳送門 斜率優化dp經典題目。 首先需要證明只要選擇的K個斷點是相同的,那麼得到的答案也是相同的。 根據分治的思想,我們只需要證明有兩個斷點時成立,就能推出K個斷點時成立。 我們設兩個斷點分成的三段連續

2829 斜率優化dp

思路:還是先列出普通的dp方程,dp[i][j]=min(dp[k][j-1]+s(i,k+1))  表示到前i個站點,用了j次爆炸,得到的最小值,其中s(i,k+1)表示從k+1到i的連乘積。 直接做必然是n^3 因為需要列舉k。考慮到dp[i][j],當j為定值,它隨著

2018.11.02【HNOI2008】【BZOJ1010】【洛谷P3195】玩具裝箱斜率優化DP

洛谷傳送門 解析: 看到平方項多半就是兩種套路,決策單調性和斜率優化,這道題斜率優化可以O(n)O(n)O(n)。 首先還是推DP式子,這個很好想(sumsumsum表示字首和)。fi=min⁡j=

洛谷2120 [ZJOI2007]倉庫建設斜率優化dp

感覺和鋸木廠那個題很類似的。 其實這個題還那個題唯一的區別就是\(dp\)轉移式子中的\(f\)變成了\(g\) qwq不想多說了 直接看我的前一篇題解吧qwq #include<iostream> #include<cstdio> #include<algorithm&

洛谷4056 [JSOI2009]火星藏寶圖斜率優化+dp

qwq又要吐槽一句我菜的真實。 由於網上很多 O ( n

洛谷4360[CEOI2004]鋸木廠選址 斜率優化+dp

qwq 我感覺這都已經不算是斜率優化 d p dp d

洛谷3648 [APIO2014]序列分割斜率優化+dp

首先對於這個題目。 qwq 存在一個性質就是,最終的答案只跟你的分割的位置有關,而和順序無關。 舉一個小栗子 a  

洛谷2900 [USACO08MAR]土地徵用Land Acquisition 斜率優化+dp

自閉的一批…為什麼斜率優化能這麼自閉。 首先看到這個題的第一想法一定是按照一個維度進行排序。 那我們不妨直接按照 h i

洛谷3195 [HNOI2008]玩具裝箱TOY斜率優化+dp

qwq斜率優化好題 第一步還是考慮最樸素的 d p dp

P3195 [HNOI2008]玩具裝箱TOY斜率優化dp

玩具 eight sin nbsp https org 問題 div 前綴和 P3195 [HNOI2008]玩具裝箱TOY 設前綴和為$s[i]$ 那麽顯然可以得出方程 $f[i]=f[j]+(s[i]-s[j]+i-j-L-1)^{2}$ 換下順序 $f[i]