斜率dp

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 10005
#define maxm 5005
using namespace std;
int dp[maxn][maxm];
int q[maxn*];
int num[maxn]; bool check(int j,int tail,int i)
{
int yk=dp[q[tail-]][j-]+num[q[tail-]+]*num[q[tail-]+];
int yj=dp[q[tail]][j-]+num[q[tail]+]*num[q[tail]+];
int yi=dp[i][j-]+num[i+]*num[i+];
int xk=*num[q[tail-]+];
int xj=*num[q[tail]+];
int xi=*num[i+];
if((yi-yk)*(xj-xk)<=(yj-yk)*(xi-xk))return ;
return ;
} bool get(int head,int j,int i)
{
int y1=dp[q[head]][j-]+num[q[head]+]*num[q[head]+];
int y2=dp[q[head+]][j-]+num[q[head+]+]*num[q[head+]+];
int x1=num[q[head]+];
int x2=num[q[head+]+];
if((y2-y1)<=*num[i]*(x2-x1))return ;
return ;
} int main()
{
int n,m,t;
int ca=;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&num[i]);
sort(num+,num+n+);
int tail,head;
for(int i=;i<=n;i++)
dp[i][]=(num[i]-num[])*(num[i]-num[]);
for(int j=;j<=m;j++)
{
head=tail=;
q[++tail]=j-;
for(int i=j;i<=n;i++)
{
while(tail-head>&&check(j,tail,i))tail--;
q[++tail]=i;
while(tail-head>&&get(head+,j,i))head++;
int best=q[head+];
dp[i][j]=dp[best][j-]+(num[i]-num[best+])*(num[i]-num[best+]); }
}
printf("Case %d: %d\n",ca++,dp[n][m]);
}
return ;
}

四边形不等式优化:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 10005
#define maxm 5005
#define inf 99999999
using namespace std; int dp[maxn][maxm];
int s[maxn][maxm];
int num[maxn]; int main()
{
int n,m;
int t,ca=;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
scanf("%d",&num[i]);
sort(num+,num++n);
dp[][]=;
for(int i=; i<=n; i++)
{
dp[i][]=(num[i]-num[])*(num[i]-num[]);
}
for(int j=; j<=m; j++)
{
s[n+][j]=n-;
for(int i=n; i>=j; i--)
{
dp[i][j]=inf;
for(int k=s[i][j-]; k<=s[i+][j]; k++)
{
int tmp=dp[k][j-]+(num[i]-num[k+])*(num[i]-num[k+]);
if(dp[i][j]>tmp)
{
s[i][j]=k;
dp[i][j]=tmp;
}
}
}
}
printf("Case %d: %d\n",ca++,dp[n][m]);
}
return ;
}

hdu 3480的更多相关文章

  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

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

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

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

  6. HDU 3480 DP+斜率优化

    题意:给你n个数字,然后叫你从这些数字中选出m堆,使得每一堆的总和最小,一堆的总和就是这一堆中最大值减去最小值的平方,最后要使得所有堆加起来的总和最小. 思路:对这些数字排序之后,很容易想到DP解法, ...

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

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

  8. HDU 3480 斜率dp

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

  9. HDU 3480 DP 斜率优化 Division

    把n个数分成m段,每段的值为(MAX - MIN)2,求所能划分得到的最小值. 依然是先从小到大排个序,定义状态d(j, i)表示把前i个数划分成j段,所得到的最小值,则有状态转移方程: d(j, i ...

随机推荐

  1. 关于Eclipse平台的使用和开发第一个SWT程序

    IBM把投入巨资开发的Eclipse作为一个开源项目捐献给了开源组织Eclipse.org Eclipse出色而有独创的平台特性,现在仍由IBM子公司OTI(主要从事Eclipse开发的人)继续领导着 ...

  2. linux gpg 使用笔记

    http://linux.chinaunix.net/techdoc/system/2009/04/30/1109541.shtml 一.GnuPG的简介     我们在网上的发送的邮件是明文的,可以 ...

  3. ASP.NET5/MVC6 下生成Helppage

    https://github.com/domaindrivendev/Ahoy 打开nuget包管理器,搜索Swashbuckle 打开Startup.cs文件在ConfigureServices方法 ...

  4. effective c++(07)之为多态基类声明virtual析构函数

    class TimeKeeper { public: TimeKeeper() ; ~TimeKepper() ; ... } ; class AtomicClock:public TimeKeepe ...

  5. 常用经典SQL语句大全(提升)

    二.提升 1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1(仅用于SQlServer) ...

  6. C# IO操作(二)File类和Directory类的常用方法

    本篇主要介绍一些常用的IO操作,对文件和目录的操作:留给自己复习之用. 1.创建文件 string sPath1=Path.GetDirectoryName(Assembly.GetExecuting ...

  7. java多线程总结五:线程池的原理及实现

    1.线程池简介:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.        假设一个服务器完成一项任务所需时间为:T1 创 ...

  8. 区分.net、c#、asp.net三者间的关系

    1..net(dot net) .net是一个平台,抽象的平台概念. 实现形式是库:①定义了基本的类型(通用类型系统CTS,common type system).   ②包含.net公共语言运行库( ...

  9. 关于windows10调试应用注册失败

    搜索了一些方法,都是win8系统的应用程序解决方案,修改应用程序的包名.也尝试修改了一些,但是失败,任然报错,以前在这个机器上面是能正常调试的,唯一的不同点是就是系统升级到10166了,于是去设置里面 ...

  10. C# this关键字详解

    this关键字主要有一下几个用途:1,this 用来引用当前类的实例,和扩展方法的第一个参数的修饰符 }2,限定被相似的名称隐藏的成员,例如: public Employee(string name, ...