[BZOJ4518][Sdoi2016]征途(斜率優化dp)
題目描述
題解
題目讓求
令
所以實際上就是將n個數劃分成m個部分然後讓這些部分的平方和儘量小
令
那麼
那麼i那一維不管,剩餘展開
這樣就可以斜率優化了
程式碼
#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=minj=
洛谷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]