HDU3480
题意:给你n个数,然后让你分成m个集合,每个集合有一个值(最大值减最小值,然后平方),求整个集合的可能最小值。
思路:因为每个集合里的值只和最大和最小值有关,所以很容易想到先排序,然后用DP可求得解,状态转移方程dp[i][j] = min(dp[i][j] , dp[k][j - 1] + (a[i] - a[k + 1]) ^ 2),j表示数组的下标,i表示集合数,dp为最小值,但是因为n为10000,m为5000,这个复杂度肯定会超时,所以可以用斜率或四边形优化来减小复杂度,式子就不证明了,这里直接引用,另外贴上四边形优化的一个链接,讲的挺详细的点击打开链接
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 10010
#define ll long long
using namespace std; ll a[MAXN];
ll dp[MAXN][MAXN];
int N, M;
ll q[MAXN];
ll head, tail; void init()
{
for (int i = 1; i <= N; i++)
dp[1][i] = (a[i] - a[1])*(a[i] - a[1]);
} void solve()
{
for(int i=2;i<= M;i++)
{
head=tail=0;
q[tail++]=i-1;
for(int j = i;j <= N;j++)
{
while(head+1<tail)
{
int p1=q[head];
int p2=q[head + 1];
int x1=a[p1 + 1];
int x2=a[p2 + 1];
int y1=dp[i - 1][p1] + x1*x1;
int y2=dp[i - 1][p2] + x2*x2;
if((y2-y1)<= 2*a[j]*(x2-x1))head++;
else break;
}
int k=q[head];
dp[i][j]=dp[i-1][k]+(a[j]-a[k+1])*(a[j]-a[k+1]);
while(head+1<tail)
{
int p1=q[tail-2];
int p2=q[tail-1];
int p3=j;
int x1=a[p1+1];
int x2=a[p2+1];
int x3=a[p3+1];
int y1=dp[i-1][p1]+x1*x1;
int y2=dp[i-1][p2]+x2*x2;
int y3=dp[i-1][j]+x3*x3;
if ((y3-y2)*(x2-x1)<=(y2-y1)*(x3-x2))tail--;
else break;
}
q[tail++]=j;
}
}
}
int main()
{
int T;
scanf("%d",&T);
int k=0;
while(T--)
{
k++;
scanf("%d%d",&N,&M);
for (int i = 1; i <= N; i++)
scanf("%d", &a[i]);
sort(a+1,a+N+1);
init();
solve();
printf("Case %d: %d\n",k,dp[M][N]);
}
return 0;
}
HDU3480的更多相关文章
- HDU3480 Division —— 斜率优化DP
题目链接:https://vjudge.net/problem/HDU-3480 Division Time Limit: 10000/5000 MS (Java/Others) Memory ...
- hdu3480二维斜率优化DP
Division Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 999999/400000 K (Java/Others) Tota ...
- hdu3480 Division(dp平行四边形优化)
题意:将n个数分成m段,每段的代价为最大值减最小值的平方,为代价最小是多少n<=10000 ,m<=5000 题解:先拍好序,从小到大,这样绝对是花费最小的,不过怎么样来做呢?一定很容易想 ...
- HDU-3480 Division (四边形不等式优化DP)
题目大意:将n个数分成m组,将每组的最大值与最小值的平方差加起来,求最小和. 题目分析:先对数排序.定义状态dp(i,j)表示前 j 个数分成 i 组得到的最小和,则状态转移方程为dp(i,j)=mi ...
- HDU3480:Division——题解
http://acm.hdu.edu.cn/showproblem.php?pid=3480 将一列数划分成几个集合,这些集合的并集为该数列,求每个数列的(最大值-最小值)^2的和的最小值. 简单的d ...
- [HDU3480] Division [四边形不等式dp]
题面: 传送门 思路: 因为集合可以无序选择,所以我们先把输入数据排个序 然后发先可以动归一波 设$dp\left[i\right]\left[j\right]$表示前j个数中分了i个集合,$w\le ...
- HDU3480 Division——四边形不等式或斜率优化
题目大意 将N个数分成M部分,使每部分的最大值与最小值平方差的和最小. 思路 首先肯定要将数列排序,每部分一定是取连续的一段,于是就有了方程 $\Large f(i,j)=min(f(i-1,k-1) ...
- hdu3480 Division
Problem Description Little D is really interested in the theorem of sets recently. There's a problem ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
随机推荐
- outline属性
outline(轮廓)用于设置元素周围的一条线,用于元素边框的外围,可起到突出元素的作用. outline属性所有浏览器都支持,如果规定了 !DOCTYPE,则 IE8 支持 outline 属性. ...
- 源代码安装GIT
参考URL:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=25150840&id=4250659 若是条件允许,从源代 ...
- Jenkins安装入门
这是一次兴奋之旅哈..说不定用得着呢~~~:) 嘿嘿.. 安装很简单,JDK,MAVEN(如果),YUM或RPM包安装JENKINS(因为好像YUM安装好慢,不如RPM下载安装) 参考URL: htt ...
- MYSQL的binary解决mysql数据大小写敏感问题 《转载》
BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写如下:mysql> select binary 'ABCD'='abcd ...
- dwr消息推送和tomcat集群
网友的提问: 项目中用到了dwr消息推送.而服务端是通过一个http请求后 触发dwr中的推送方法.而单个tomcat中.服务器发送的http请求和用户都在一个tomcat服务器中.这样就能精准推送到 ...
- 【JS模式】单体模式
<JavaScript模式> /** * 单体(Singleton)模式的思想在于保证一个特定类仅有一个实例.这意味着当您第二次使用同一个类创建新对象的时候,每次得到与第一次创建对象完全相 ...
- 【转】 为SeekBar滑块设置固定值以及自定义Seekbar,progressbar样式--不错
原文网址:http://blog.csdn.net/jdsjlzx/article/details/7804080 最近在项目中使用到了seekbar和progressbar,且必须按照设计要求来进行 ...
- 图论(KM算法,脑洞题):HNOI 2014 画框(frame)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABPoAAANFCAIAAABtIwXVAAAgAElEQVR4nOydeVxTV/r/n9ertaJEC4
- Codeforces 715B & 716D Complete The Graph 【最短路】 (Codeforces Round #372 (Div. 2))
B. Complete The Graph time limit per test 4 seconds memory limit per test 256 megabytes input standa ...
- Linux下动态库的使用
1.生成动态库: gcc -fPIC -shared -o libdemo.so demo.c 考虑程式库major的升级会破坏兼容性:而minior的升级则可能不会,一般建议用以下方式来生成动态库. ...