luoguP4072 [SDOI2016]征途
[SDOI2016]征途
大体
大概就是推推公式,发现很傻逼的\(n^3\)DP
get60
进一步我们发现状态不能入手,考虑优化转移
套个斜率优化板子
每一层转移来一次斜率优化
思路
先便便式子
\]
\]
\]
\]
\]
\]
\]
额,多化简化简,就得到了,LaTeX太麻烦了,这里就不多打了
\]
\]
\]
注意:\(\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,无脑状态)
状态转移方程:
\]
然后我们可以这个样纸
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]征途的更多相关文章
- bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...
- 动态规划(决策单调优化):BZOJ 4518 [Sdoi2016]征途
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 532 Solved: 337[Submit][Status][ ...
- BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]
4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...
- bzoj4518[Sdoi2016]征途 斜率优化dp
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1657 Solved: 915[Submit][Status] ...
- BZOJ_4518_[Sdoi2016]征途_斜率优化
BZOJ_4518_[Sdoi2016]征途_斜率优化 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到 ...
- 斜率优化入门学习+总结 Apio2011特别行动队&Apio2014序列分割&HZOI2008玩具装箱&ZJOI2007仓库建设&小P的牧场&防御准备&Sdoi2016征途
斜率优化: 额...这是篇7个题的题解... 首先说说斜率优化是个啥,额... f[i]=min(f[j]+xxxx(i,j)) ; 1<=j<i (O(n^2)暴力)这样一个式子,首 ...
- 【BZOJ4518】[Sdoi2016]征途 斜率优化
[BZOJ4518][Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除 ...
- BZOJ4518 Sdoi2016 征途 【斜率优化DP】 *
BZOJ4518 Sdoi2016 征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m ...
- 洛谷 P4072 [SDOI2016]征途 斜率优化DP
洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...
随机推荐
- github上删除一个项目或者reposity
1,点击github的头像,选择如下操作. 2.选择要删除的reposity 3.选择settings 4.复制reposity名字,然后下滑鼠标到底部,选择delete this reposity ...
- sitecore系统教程之默认收集数据库MongoDB注意事项
MongoDB是一个高度可扩展的基于文档的NoSQL数据库解决方案,Sitecore体验数据库(xDB)用于收集数据库.在安装MongoDB之前,您应该考虑以下事项: 确定您是需要基于公共云的解决方案 ...
- mvc未登录跳转到登录界面
编写一个mvc控制器基类BaseController , 其继承自controller 重写其OnActionExecuting方法, 在其中检测session值,如果没有,则跳转至登录页面. 如下
- 大数据处理框架之Strom: Storm拓扑的并行机制和通信机制
一.并行机制 Storm的并行度 ,通过提高并行度可以提高storm程序的计算能力. 1.组件关系:Supervisor node物理节点,可以运行1到多个worker,不能超过supervisor. ...
- git使用遇到的坑
把一个完整项目提交到github上步骤以及注意事项 Git的安装就不说了. 第一步:mkdir/cd 我们需要先创建一个本地的版本库(其实也就是一个文件夹). 你可以直接右击新建文件夹,也可以右击打开 ...
- flask 单个页面多个表单(单视图处理、多视图处理)
单个页面多个表单 除了在单个表单上实现多个提交按钮,有时还需要在单个页面上创建多个表单.比如,在程序的主页上同时添加登录和注册表单.当在同一个页面上添加多个表单时,我们需要解决的问题是在视图函数中判断 ...
- python深拷贝和浅拷贝的区别
首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别. 什么是可变对象,什么是不可变对象: 可变对象 ...
- 51nod 1130 N的阶乘的长度 V2(斯特林近似)
输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 1000) 第2 - T + ...
- Linux 进程管理 ps、top、pstree命令
ps命令:查看系统中正在运行的进程 ps 是用来静态地查看系统中正在运行的进程的命令.不过这个命令有些特殊,它的部分选项不能加入"-",比如命令"ps aux" ...
- POJ 1308 Is It A Tree?和HDU 1272 小希的迷宫
POJ题目网址:http://poj.org/problem?id=1308 HDU题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1272 并查集的运用 ...