[SDOI2016]征途

大体

大概就是推推公式,发现很傻逼的\(n^3\)DP

get60

进一步我们发现状态不能入手,考虑优化转移

套个斜率优化板子

每一层转移来一次斜率优化

思路

先便便式子

\[s^2=m^{2}*\frac{\sum_{1}^{m}(a_{i}-\overline{a})^2}{m}
\]

\[=m*\sum_{1}^{m}(a_{i}-\overline{a})^2
\]

\[=m*\sum_{1}^{m}(a_{i}^2-2*a_{i}*\overline{a}+\overline{a}^2)
\]

\[=m*\sum_{1}^{m}a_{i}^2-m*\sum_{1}^{m}2*a_{i}*\overline{a}+m*\sum_{1}^{m}\overline{a}^2
\]

\[=m*\sum_{1}^{m}a_{i}^2-m*\sum_{1}^{m}2*a_{i}*\overline{a}+m*\sum_{1}^{m}\overline{a}^2
\]

\[\overline{a}^2=\frac{\sum_{1}^{m}a_{i}}{m}
\]

\[=m*\sum_{1}^{m}a_{i}^2-m*\sum_{1}^{m}2*a_{i}*\frac{\sum_{1}^{m}a_{i}}{m}+m*\sum_{1}^{m}(\frac{\sum_{1}^{m}a_{i}}{m})^2
\]

额,多化简化简,就得到了,LaTeX太麻烦了,这里就不多打了

\[=m*\sum_{1}^{m}a_{i}^2-2*(\sum_{1}^{m}a_{i})^2+\sum_{1}^{m}\frac{(\sum_{1}^{m}a_{i})^2}{m}
\]

\[=m*\sum_{1}^{m}a_{i}^2-2*(\sum_{1}^{m}a_{i})^2+(\sum_{1}^{m}a_{i})^2
\]

\[=m*\sum_{1}^{m}a_{i}^2-(\sum_{1}^{m}a_{i})^2
\]

注意:\(\sum_{1}^{m}a_{i}^2\)和\(2*(\sum_{1}^{m}a_{i})^2\)并不相同

然后我们发现\(2*(\sum_{1}^{m}a_{i})^2\)是个定值

我们只需要求\(\sum_{1}^{m}a_{i}^2\)这个最小就好了(m>0不用考虑)

然后我们可以\(f[i][j]\)表示选了\(i\)次,到了第\(j\)个点的最小和(入门dp,无脑状态)

状态转移方程:

\[f[i][j]=min(f[i][j],f[i-1][k]+(sum[j]-sum[k])*(sum[j]-sum[k]))
\]

然后我们可以这个样纸

FOR(i,1,n) //选的第几次点
FOR(j,1,n) //位置
FOR(k,0,j) //由前面转移
f[i][j]=min(f[i][j],f[i-1][k]+(sum[j]-sum[k])*(sum[j]-sum[k]));

我们发现状态是\(n^2\)个,每次转移是O(n)的,太墨迹了

那就套个斜率板子加个速,n次斜率转移

每一层都是由上一层转移,也可以滚动数组省内存一下,我看着128MB有点小

暴力60

/*
此题推出式子来就好办了,n^3dp直接斜率优化成n^2
次代码为本体暴力
*/
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e6+7;
ll read() {
ll x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
ll n,m,sum[N];
ll f[3007][3007];
int main() {
n=read(),m=read();
for(int i=1;i<=n;++i) {
int x=read();
sum[i]=sum[i-1]+x;
}
memset(f,0x3f,sizeof(f));
for(int i=0;i<=n;++i) f[1][i]=sum[i]*sum[i];
for(int i=2;i<=m;++i) {
f[i][0]=0;
for(int j=1;j<=n;++j) {
for(int k=0;k<=j;++k) {
f[i][j]=min(f[i][j],f[i-1][k]+(sum[j]-sum[k])*(sum[j]-sum[k]));
}
}
}
cout<<m*f[m][n]-sum[n]*sum[n]<<"\n";
return 0;
}

AC代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=3007;
ll read() {
ll x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
ll n,m,sum[N],f[N][N],q[N];
double calc(ll j,ll k,ll x) {
ll xx=sum[j];
ll yy=f[x-1][j]+sum[j]*sum[j];
ll xx_=sum[k];
ll yy_=f[x-1][k]+sum[k]*sum[k];
return (yy-yy_)/(2.0*(xx-xx_));
}
void work(int x) {
int h=0,d=0;
for(int i=1;i<=n;++i){
while(h<d && calc(q[h],q[h+1],x) <= sum[i]) h++;
f[x][i]=f[x-1][q[h]]+(sum[i]-sum[q[h]])*(sum[i]-sum[q[h]]);
while(h<d && calc(q[d],q[d-1],x) >= calc(q[d],i,x)) d--;
q[++d]=i;
}
}
int main() {
n=read(),m=read();
for(int i=1;i<=n;++i) {
int x=read();
sum[i]=sum[i-1]+x;
}
memset(f,0x3f,sizeof(f));
for(int i=0;i<=n;++i) f[1][i]=sum[i]*sum[i];
for(int i=2;i<=m;++i) {
f[i][0]=0;
work(i);
}
cout<<m*f[m][n]-sum[n]*sum[n]<<"\n";
return 0;
}

wxy刷noi,而我等蒟蒻只能刷省选

luoguP4072 [SDOI2016]征途的更多相关文章

  1. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  2. 动态规划(决策单调优化):BZOJ 4518 [Sdoi2016]征途

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 532  Solved: 337[Submit][Status][ ...

  3. BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]

    4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...

  4. bzoj4518[Sdoi2016]征途 斜率优化dp

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1657  Solved: 915[Submit][Status] ...

  5. BZOJ_4518_[Sdoi2016]征途_斜率优化

    BZOJ_4518_[Sdoi2016]征途_斜率优化 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到 ...

  6. 斜率优化入门学习+总结 Apio2011特别行动队&Apio2014序列分割&HZOI2008玩具装箱&ZJOI2007仓库建设&小P的牧场&防御准备&Sdoi2016征途

    斜率优化: 额...这是篇7个题的题解... 首先说说斜率优化是个啥,额... f[i]=min(f[j]+xxxx(i,j)) ;   1<=j<i (O(n^2)暴力)这样一个式子,首 ...

  7. 【BZOJ4518】[Sdoi2016]征途 斜率优化

    [BZOJ4518][Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除 ...

  8. BZOJ4518 Sdoi2016 征途 【斜率优化DP】 *

    BZOJ4518 Sdoi2016 征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m ...

  9. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

随机推荐

  1. Nginx常用功能

    3.Nginx常用功能 3.1 反向代理服务器 3.1.1.demo2 a.我在tomcat下部署了一个javaweb项目,tomcat安装的服务器IP为:192.168.37.136,部署的项目在t ...

  2. 《大话设计模式》c++实现 抽象工厂模式

    为了更清晰地理解工厂方法模式,需要先引入两个概念: 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间 ...

  3. Attention Is All You Need 一些好的资料

    The encoders are all identical in structure (yet they do not share weights). Each one is broken down ...

  4. Lua 可变参数之arg与select

    function TestFunc(...) local arg = { ... } --Lua .2以后不再支持默认arg参数,{}与...之间要有空格 print("输入的参数个数:&q ...

  5. web api HttpConfiguration

    //设置web api configuration public static void Register(HttpConfiguration config){ config.Services.Rep ...

  6. eclipse xml 文件添加注解快捷键

    eclipse xml 文件注解快捷键: <!--  --> Ctrl + shift + / 添加注解 Ctrl + shift + \ 取消注解

  7. Vim 文本编辑器的基本使用

    Vim文本编辑器是Linux/Unix系统下最常用的工具之一,通过该工具可以很方便的建立.修改.编辑文档或者程序文件,其作用类似与windows系统下的记事本或者notepad++,因此熟练掌握该工具 ...

  8. mybatis源码解析2---SqlSessionFactoryBuilder、SqlSessionFactory解析

    1.先看一个mybatis最简单的Demo String resource = "mybatis-config.xml"; //1.流形式读取mybatis配置文件 InputSt ...

  9. Linux基础命令---traceroute追踪路由

    traceroute       traceroute指令输出到目标主机的路由包.Traceroute跟踪从IP网络到给定主机的路由数据包.它利用IP协议的生存时间(TTL)字段,并试图在通往主机的路 ...

  10. notepad 正则表达式 复制 文本