日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷4072 SDOI2016征途 (斜率优化+dp)

發(fā)布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷4072 SDOI2016征途 (斜率优化+dp) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先根據(jù)題目中給的要求,推一下方差的柿子。

\[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\)

那我們實際上就是最大化平方和。

由于題目限制了要分\(m\)段。所以我們的\(dp\)狀態(tài)就是\(f[i][j]\)表示前\(i\)個數(shù)分了\(j\)段。
那么一個比較顯然的轉(zhuǎn)移
\(dp[i][p]=min(dp[j][p-1]+(s[i]-s[j]^2))\)

然后直接套斜率優(yōu)化就好了!

但是要注意的是,因為題目中對第二維有點限制,所以我們要開\(m\)個單調(diào)隊列來維護。
對于\(dp[i][j]\),每次從\(j-1\)的單調(diào)隊列要轉(zhuǎn)移。

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> #include<set> #define mk make_pair #define ll long long using namespace std; inline int read() {int x=0,f=1;char ch=getchar();while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f; } const int maxn = 3010; struct Point{int x,y; }; ll chacheng(Point x,Point y) {ll xx = x.x;ll yy = x.y;ll xxx = y.x;ll yyy = y.y;return xx*yyy-xxx*yy; } struct Node{Point q[maxn];int head=1,tail=0;bool count(Point i,Point j,Point k){Point x,y;x.x=k.x-i.x;x.y=k.y-i.y;y.x=k.x-j.x;y.y=k.y-j.y;if (chacheng(x,y)<=0ll) return true;return false;}void push(Point x){while (tail>=head+1 && count(q[tail-1],q[tail],x)) tail--;q[++tail]=x;}void pop(int lim){while (tail>=head+1 && q[head+1].y-q[head].y<lim*(q[head+1].x-q[head].x)) head++;} }; Node q[maxn]; int sum[maxn]; int n,m; int dp[maxn][maxn]; int main() {n=read();m=read();for (int i=1;i<=n;i++) sum[i]=read();for (int i=1;i<=n;i++) sum[i]+=sum[i-1];for (int i=0;i<=n;i++) q[i].push((Point){0,0});for (int i=1;i<=n;i++){for (int j=1;j<=min(i,m);j++){q[j-1].pop(2*sum[i]);Point now = q[j-1].q[q[j-1].head];dp[i][j]=now.y-now.x*now.x + (sum[i]-now.x)*(sum[i]-now.x);q[j].push((Point){sum[i],dp[i][j]+sum[i]*sum[i]});}}//cout<<dp[n][m]<<" "<<m<<" "<<sum[n]*sum[n]<<endl;cout<<dp[n][m]*m-sum[n]*sum[n]<<endl;return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/yimmortal/p/10178961.html

總結(jié)

以上是生活随笔為你收集整理的洛谷4072 SDOI2016征途 (斜率优化+dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。