斜率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. Vim 的补全模式加速器,轻松玩转全部 15 种自动补全模式

    1. 关于 Vim 补全模式    ---- Vim 一共提供了 15 种自动补全的模式(:help ins-completion).其中有两种的补全列表内容与另外两种相同,只是排序不同,这 15 种 ...

  2. WinForm控件小知识

    1.DataGridView控件显示自定义表 //造个数据表 DataTable dt = new DataTable(); dt.Columns.Add("DEcode", Sy ...

  3. Android之Http网络编程(一)

    Android应用作为一个客户端程序绝大部分都是需要进行网络请求和访问的,而http通信是一种比较常见并常用的通信方式. 在Android中http网络编程中有两种实现方式,一种是使用HttpURLC ...

  4. mysql关键字讲解(join 、order by、group by、having、distinct)

    1.join     1.1 OUTER JOIN:想要包含右侧表中的所有行,以及左侧表中有匹配记录的行.        1.11 Mysql中有左连接(left join):            ...

  5. JS中null与undefined的区别

    1.typeof操作符 用来检测变量的数据类型 例:typeof 3.14 //返回number typeof [1,2,3]  //返回object 2.null 只有一个值的特殊类型,表示一个空对 ...

  6. OC3_字典

    // // main.m // OC3_字典 // // Created by zhangxueming on 15/6/12. // Copyright (c) 2015年 zhangxueming ...

  7. C语言遍历一个文件夹下面的所有文件

    主要用到的函数/function. These should get you started: opendir() readdir() closedir() fopen() fread() fwrit ...

  8. HDOJ 1042 N! -- 大数运算

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1042 Problem Description Given an integer N(0 ≤ N ≤ 1 ...

  9. OpenJudge 2802 小游戏 / Poj 1101 The Game

    1.链接地址: http://bailian.openjudge.cn/practice/2802 http://poj.org/problem?id=1101 2.题目: 总时间限制: 1000ms ...

  10. windows phone 操作 http异步返回结果

    wp中为了提升用户体验,砍掉了http的同步操作,仅支持http异步请求,那么该如何及时处理异步操作返回的结果.纠结了很久,终于在技术群中好友的帮助下解决了问题,借助事件,将异步编程模型模式简单的处理 ...