题目大意:一个有n个数的集合,现在要求将他分成m+1个子集,对子集i设si表示该集合中最大数与最小数的差的平方。求所有si的和的最小值。n<=10000,m<=5000.

分析:最优解的m个集合肯定不会相交,也不会出现空集,而且每个子集的数必定是连续的。
所以可以将n个数先排序,在来进行dp求解。
f[i][j]表示前j个数分成i个集合的最优解。

转移方程为:f[i][j]=min(f[i-1][k]+(num[j]-num[k+1])^2

设决策点k1<k2,若有k2比k1更优,则有:

f[i-1][k1]+num[k1+1]^2-2*num[j]*num[k1+1]<f[i-1][k2]+num[k2+1]^2-2*num[j]*num[k2+1]

将关于j的项移到右边,关于k1、k2的项移到左边:

f[i-1][k1]+num[k1+1]^2-(f[i-1][k2]+num[k2+1]^2)>2num[j]*(num[k1+1]-num[k2+1])

令yk1=f[i-1][k1]+num[k1+1]^2,xk1=num[k1+1],

则上式可以转化为:(yk2-yk1)/(2(xk2-xk1))<num[j] 。

于是,可知有效的决策点构成了下凸包。

通过单调队列可以解决该问题。

 #include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define MAXN 10005
using namespace std;
int f[][MAXN],row;
int que[MAXN],head,tail,t,n,m;
int num[MAXN];
int up(int j,int k)
{
return f[!row][j]+num[j+]*num[j+]-f[!row][k]-num[k+]*num[k+];
}
int down(int j,int k)
{
return (num[j+]-num[k+])*;
}
bool turnup(int i,int j,int k) //向上为1,向下为0
{
int y2=up(i,j),x2=down(i,j),y1=up(j,k),x1=down(j,k);
if(x1*y2>x2*y1)return ;
else return ;
}
int main()
{
scanf("%d",&t);
for(int cas=;cas<=t;cas++)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&num[i]);
sort(num+,num+n+);
head=tail=;
que[tail++]=;
for(int i=;i<=n;i++)
f[][i]=(num[i]-num[])*(num[i]-num[]);
for(int r=;r<=m;r++)
{
row=(r&);
head=tail=;
que[tail++]=r-;
for(int i=r;i<=n;i++)
{
while(head<tail-&&up(que[head+],que[head])<=down(que[head+],que[head])*num[i])
head++;
f[row][i]=f[!row][que[head]]+(num[i]-num[que[head]+])*(num[i]-num[que[head]+]);
while(head<tail-&&(turnup(i,que[tail-],que[tail-])==))
tail--;
que[tail++]=i;
}
}
printf("Case %d: %d\n",cas,f[m&][n]);
memset(f,,sizeof f);
memset(que,,sizeof que); }
}

HDU 3480 division的更多相关文章

  1. hdu 3480 Division(斜率优化DP)

    题目链接:hdu 3480 Division 题意: 给你一个有n个数的集合S,现在让你选出m个子集合,使这m个子集合并起来为S,并且每个集合的(max-min)2 之和要最小. 题解: 运用贪心的思 ...

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

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

  3. HDU 3480 Division(斜率DP裸题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3480 题目大意:将n个数字分成m段,每段价值为(该段最大值-该段最小值)^2,求最小的总价值. 解题思 ...

  4. HDU 3480 Division(斜率优化+二维DP)

    Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others) Tota ...

  5. hdu 3480 Division(四边形不等式优化)

    Problem Description Little D is really interested in the theorem of sets recently. There’s a problem ...

  6. HDU 3480 Division DP斜率优化

    解题思路 第一步显然是将原数组排序嘛--然后分成一些不相交的子集,这样显然最小.重点是怎么分. 首先,我们写出一个最暴力的\(DP\): 我们令$F[ i ][ j ] $ 为到第\(i\)位,分成\ ...

  7. HDU 6036 - Division Game | 2017 Multi-University Training Contest 1

    /* HDU 6036 - Division Game [ 组合数学,NTT ] | 2017 Multi-University Training Contest 1 题意: k堆石子围成一个圈,数量 ...

  8. HDU 6036 Division Game

    HDU 6036 Division Game 考虑每堆石头最多操作 $ \sum e $ 次,考虑设 $ f(x) $ 表示某一堆石头(最开始都是一样的)操作 $ x $ 次后变成了 $ 1 $ 的方 ...

  9. 【HDU】3480 Division

    http://acm.hdu.edu.cn/showproblem.php?pid=3480 题意:一个n个元素的集合S要求分成m个子集且子集并为S,要求$\sum_{S_i} (MAX-MIN)^2 ...

随机推荐

  1. C语言 负数取余的原理

    负数求余数运算是一个数学问题: 任何一个整数n都可以表示成 n=k*q+r 其中0<=|r|<|q| 这里的r就是n除以q的余数,即 r==n%q 例如: -9=(-2)*4+(-1) 则 ...

  2. UI学习笔记---第八天

    UINavigationController的用法   界面间传值 UInavigationController继承于UIViewController,以栈的方式管理所控制的师徒控制器,至少要有一个被 ...

  3. SAP保存操作记录CDHDR和CDPOS表

    http://blog.sina.com.cn/s/blog_7dce1fac01014yp2.html转自sap的字段和对象的修改都会保存旧值,数据保存在CDHDR和CDPOS表中,提取旧值可以采用 ...

  4. Ionic基础——侧边栏ion-side-menus 以及ion-tap结合侧边栏详解

    一. 侧边栏菜单 : ion-side-menus 侧边栏菜单是一个最多包含三个子容器的元素: 默认情况下,侧边栏菜单将只显示ion-side-menu-content容器的内容. 向左滑动时,将显示 ...

  5. CollectionsAPI

    鉴于总用,总结一下: 类别 方法 查找 binarySearch. 返回 enumeration.checkedSortedMap 判断 max.min 移动 reverse(List).revers ...

  6. .net中创建xml文件

    //创建空的XML文档 XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml("<?xml version='1.0' enco ...

  7. c#---部分;把数组或者结构体存入集合里,然后再从集合中取出之后,输出;foreach既可以用到提取数组重点额数据,也可以提取集合中的数据(前提是集合中的元素是相同数据类型)

    1.输入班级人数,统计每个人的姓名,性别,年龄:集合与数组 //Console.Write("请输入班级人数:"); //int a = int.Parse(Console.Rea ...

  8. 工作中遇到的问题--JPA 一对多查询

    /**     *  order by gs.updateDate desc          *  SELECT gs FROM GoodStatus gs WHERE gs IN(     * @ ...

  9. MySQL性能优化之max_connections配置参数浅析

    这篇文章主要介绍了MySQL性能优化之max_connections配置参数浅析,本文着重讲解了3种配置max_connections参数的方法,需要的朋友可以参考下 MySQL的max_connec ...

  10. hihoCoder:#1079(线段树+离散化)

    题目大意:给n个区间,有的区间可能覆盖掉其他区间,问没有完全被其他区间覆盖的区间有几个?区间依次给出,如果有两个区间完全一样,则视为后面的覆盖前面的. 题目分析:区间可能很长,所以要将其离散化.但离散 ...