首先想到的就是sort一下,然后每个集合都在排过序的数组里面取,不重复。

这样就推出公式dp[i][j] = min(dp[k][j-1] + (s[i]-s[k+1])^2)

其中dp[i][j]为在第i位完成j个分组的。

不考虑分组的情况下跟打印文章那题一样。考虑上需要有M个分组,就是两层for循环的dp。

这里往维护的凸包里添加点的时候,要等这一层全部解决之后再一起添进去。保证处理dp第j层时考虑的都是j-1层的情况。

还有就是初始化了。

O(N*M)大概5e7 有点卡,第一次写了个set就TLE了

 #include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std; const int maxn = 1e4+;
const int maxm = 5e3+; struct Point{
LL x,y;
Point(LL _x=,LL _y=) :x(_x),y(_y){}
bool operator < (const Point &rhs) const
{
if(x == rhs.x) return y < rhs.y;
else return x <rhs.x;
}
LL operator ^(const Point &rhs) const
{
return x*rhs.y - y*rhs.x;
}
Point operator - (const Point &rhs) const
{
return Point(x-rhs.x,y-rhs.y);
}
};
LL func(Point p,LL k)
{
return p.y - k*p.x;
} struct SlopeDP
{
Point ch[maxn];
int head,tail;
void init()
{
tail = ;head = ;
}
void push(Point u)
{
while(head >= && ((ch[head]-ch[head-])^(u-ch[head]) )<=) head--;
ch[++head] = u;
}
Point pop(int k)
{
while(tail < head && func(ch[tail],k) >= func(ch[tail+],k) ) tail++;
return ch[tail];
}
};
int T,N,M;
LL s[maxn],dp[maxn][maxm];
//set <Point> st;
Point save[maxn]; int main()
{
scanf("%d",&T);
int cas = ;
while(T--)
{
memset(dp,,sizeof dp);
scanf("%d%d",&N,&M);
for(int i=;i<=N;i++)
{
scanf("%d",&s[i]);
}
sort(s+,s++N);
SlopeDP H;
H.init();
//st.clear();
int cnt = ;
for(int i=;i<=N;i++)
{
dp[i][] = (s[i] - s[])*(s[i] - s[]);
//st.insert(Point(s[i],s[i]*s[i]+dp[i-1][1]));
save[cnt++] = Point(s[i],s[i]*s[i]+dp[i-][]);
} for(int j=;j<=M;j++)
{
H.init();
for(int i=;i<cnt;i++) H.push(save[i]);
cnt = ;
for(int i=j;i<=N;i++)
{
Point u = H.pop(*s[i]);
dp[i][j] = -*s[i]*u.x + u.y + s[i]*s[i];
//printf("i:%d %d x:%d y:%d k:%d\n",i,dp[i][j],u.x,u.y,-2*s[i]);
//H.push(Point(s[i+1],s[i+1]*s[i+1]+dp[i][j]));
save[cnt++] = Point(s[i+],s[i+]*s[i+]+dp[i][j]);
}
}
printf("Case %d: %lld\n",++cas,dp[N][M]);
}
}

HDU3480-Division-斜率dp的更多相关文章

  1. HDU3480 Division —— 斜率优化DP

    题目链接:https://vjudge.net/problem/HDU-3480 Division Time Limit: 10000/5000 MS (Java/Others)    Memory ...

  2. HDU 3480 - Division - [斜率DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3480 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  3. hdu3480 Division(dp平行四边形优化)

    题意:将n个数分成m段,每段的代价为最大值减最小值的平方,为代价最小是多少n<=10000 ,m<=5000 题解:先拍好序,从小到大,这样绝对是花费最小的,不过怎么样来做呢?一定很容易想 ...

  4. [kuangbin带你飞]专题二十 斜率DP

            ID Origin Title   20 / 60 Problem A HDU 3507 Print Article   13 / 19 Problem B HDU 2829 Lawr ...

  5. bzoj4518: [Sdoi2016]征途--斜率DP

    题目大意:把一个数列分成m段,计算每段的和sum,求所有的sum的方差,使其最小. 由方差*m可以化简得ans=m*sigma(ki^2)-sum[n]^2 很容易得出f[i][j]=min{f[i- ...

  6. hdu 3507 斜率dp

    不好理解,先多做几个再看 此题是很基础的斜率DP的入门题. 题意很清楚,就是输出序列a[n],每连续输出的费用是连续输出的数字和的平方加上常数M 让我们求这个费用的最小值. 设dp[i]表示输出前i个 ...

  7. 斜率dp cdq 分治

    f[i] = min { f[j] + sqr(a[i] - a[j]) } f[i]= min { -2 * a[i] * a[j] + a[j] * a[j] + f[j] } + a[i] * ...

  8. HDU 2829 Lawrence (斜率DP)

    斜率DP 设dp[i][j]表示前i点,炸掉j条边的最小值.j<i dp[i][j]=min{dp[k][j-1]+cost[k+1][i]} 又由得出cost[1][i]=cost[1][k] ...

  9. 斜率DP题目

    uva 12524 题意:沿河有n个点,每个点有w的东西,有一艘船从起点出发,沿途可以装运东西和卸载东西,船的容量无限,每次把wi的东西从x运到y的花费为(y-x)*wi; 问把n个点的东西合并成k个 ...

  10. bzoj 3156 防御准备(斜率DP)

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 837  Solved: 395[Submit][Status][Discuss] ...

随机推荐

  1. Python从菜鸟到高手(8):print函数、赋值与代码块

    1.神奇的print函数   print函数相信读者一定对它不陌生,因为在前面的章节,几乎每个例子都使用了print函数,这个函数的功能就是在控制台输出文本.不过print在输出文本时还可以进行一些设 ...

  2. 个人实战演练全过程——No.1 最大连续子数组求和

    之前的一次个人总结和一次单元测试入门学习是开启软件工程课程的前奏曲,也是热身,现在大家对于这门课程也有了初步的了解和认识,这次要开始真正的演奏了,要从头到尾完全靠自己的能力来解决一个问题,进行实战演练 ...

  3. JVM加载类冲突,导致Mybatis查数据库返回NULL的一个小问题

    今天碰到个bug,虽然小,但是有点意思 背景是SpringMVC + Mybatis的一个项目,mapper文件里写了一条sql 大概相当于 select a from tableA where b ...

  4. Python中Socket粘包问题的解决

    服务器端 import socket import subprocess import struct server = socket.socket() ip_port = ("192.168 ...

  5. poj3468 线段树的懒惰标记

    题目链接:poj3468 题意:给定一段数组,有两种操作,一种是给某段区间加c,另一种是查询一段区间的和 思路:暴力的方法是每次都给这段区间的点加c,查询也遍历一遍区间,复杂度是n*n,肯定过不去,另 ...

  6. 使用 Travis CI 实现项目的持续测试反馈

    [篇幅较长,10.15前补充完毕,如希望探索可直接移步Github仓库:https://github.com/SivilTaram/CITest] 在编程课中,我们可以使用成熟的在线评测系统来测试某个 ...

  7. python三数之和

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...

  8. mysql数据的导入和导出

    一. mysqldump工具基本用法,不适用于大数据备份   1. 备份所有数据库: mysqldump -u root -p --all-databases > all_database_sq ...

  9. Vue2 实现树形菜单(多级菜单)功能模块

    结构示意图 ├── index.html ├── main.js ├── router │ └── index.js # 路由配置文件 ├── components # 组件目录 │ ├── App. ...

  10. Python_阻塞IO、非阻塞IO、IO多路复用

    0.承上 进程: 计算机里最小的资源分配单位: 数据隔离, 利用多核,数据不安全. 线程: 计算机中最小的CPU调度单位: 数据共享,GIL锁,数据不安全. 协程: 线程的一部分,是有用户来调度的; ...