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\) 段,相 ...
随机推荐
- Excel的导入导出功能
POI组件的详细介绍文档: https://www.cnblogs.com/huajiezh/p/5467821.html .xls 对应 HSSFWorkbook book=new HSSFWork ...
- leetCoder-wordBreak判断能否分词
题目 Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determ ...
- python爬虫 ----文章爬虫(合理处理字符串中的\n\t\r........)
import urllib.request import re import time num=input("输入日期(20150101000):") def openpage(u ...
- CSS尺寸与补白属性-----margin和padding
margin margin:[ <length> | <percentage> | auto ]{1,4} 为元素设置所有四个方向(上右下左)的外边距 auto:水平( ...
- CSS选择符-----伪类选择符
Element:hover E:hover { sRules } 设置元素在其鼠标悬停时的样式 <!DOCTYPE html> <html> <head> < ...
- codeforces 984B Minesweeper
题意: 给出一个矩阵,如果一个格子是数字,那么与这个格子相邻的格子中有炸弹的数量必须等于这个格子中的数字: 如果一个格子是空地,那么这个格子的所有相邻的格子中就不能有炸弹. 判断这个矩阵是否合法. 思 ...
- Presto 学习
Presto 基础知识与概念学习可以参考这些博客: presto 0.166概述 https://www.cnblogs.com/sorco/p/7060166.html Presto学习-prest ...
- 【Alpha版本】冲刺阶段——Day7
[Alpha版本]冲刺阶段--Day7 阅读目录 今日进展 今日贡献量 贡献量汇总 TODOList 及项目燃尽图 [今日进展] 将项目源文件打成jar包,并运行测试 完成答辩ppt 项目运行情况 主 ...
- Shell for while 循环
li@ubuntu:~/test$ cat a.sh #!/bin/bash for loop in 1 2 3 4 5 do echo "The value is : $loop" ...
- [转载]web服务器
Web系统由客户端(浏览器)和服务器端两部分组成.Web系统架构也被称为B/S架构.最常见的Web服务器有Apache.IIS等,常用的浏览器有IE.Firefox.chrome等.当你想访问一个网页 ...