hdu 3480 Division(斜率优化DP)
题目链接:hdu 3480 Division
题意:
给你一个有n个数的集合S,现在让你选出m个子集合,使这m个子集合并起来为S,并且每个集合的(max-min)2 之和要最小。
题解:
运用贪心的思想,肯定首先将全部的数排好序,然后设dp[i][j]表示前j个数分为i个集合的最优解。
则有dp[i][j]=min{dp[i-1][k]+(a[j]-a[k+1])2}(0<k<j)。
这样写出来是三层for的dp,考虑用斜率优化降维。
假设l<k<j,对于dp[i][j],k到j为一个集合比l到j为一个集合更优。
则有:dp[i-1][k]+(a[j]-a[k+1])2<=dp[i-1][l]+(a[j]-a[l+1])2。
整理得 dp[i-1][k]+a[k+1]2 -dp[i-1][l]+a[l+1]2 /a[k+1]-a[l-1]<=2*a[j]。
然后就是y1-y2/x1-x2<=L的斜率形式了。
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std; const int N=; int t,n,m,dp[][N],Q[N],a[N],ic; int getx(int k,int l){return a[k+]-a[l+];}
int gety(int i,int k,int l){return dp[i][k]+a[k+]*a[k+]-dp[i][l]-a[l+]*a[l+];}
int check(int i,int j,int k,int l){return gety(i,j,k)*getx(k,l)<=gety(i,k,l)*getx(j,k);} int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
F(i,,n)scanf("%d",a+i);
sort(a+,a++n);
F(i,,n)dp[][i]=(a[i]-a[])*(a[i]-a[]);
F(i,,m)
{
int now=,head=,tail=;
Q[++tail]=i-;
F(j,i,n)
{
while(head<tail&&check(i&,j,Q[tail],Q[tail-]))tail--;//维护一个“下凸”曲线
Q[++tail]=j;
while(head<tail&&gety(i&,Q[head+],Q[head])<=getx(Q[head+],Q[head])**a[j])head++;
dp[(i&)^][j]=dp[i&][Q[head]]+(a[j]-a[Q[head]+])*(a[j]-a[Q[head]+]);
}
}
printf("Case %d: %d\n",++ic,dp[(m&)^][n]);
}
return ;
}
hdu 3480 Division(斜率优化DP)的更多相关文章
- hdu 2829 Lawrence(斜率优化DP)
题目链接:hdu 2829 Lawrence 题意: 在一条直线型的铁路上,每个站点有各自的权重num[i],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...
- HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)
题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...
- HDU 3480 - Division - [斜率DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3480 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- HDU3480 Division —— 斜率优化DP
题目链接:https://vjudge.net/problem/HDU-3480 Division Time Limit: 10000/5000 MS (Java/Others) Memory ...
- HDU 6619 Horse 斜率优化dp
http://acm.hdu.edu.cn/showproblem.php?pid=6619 #include<bits/stdc++.h> #define fi first #defin ...
- Print Article hdu 3507 一道斜率优化DP 表示是基础题,但对我来说很难
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- HDU 3480 Division(斜率DP裸题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3480 题目大意:将n个数字分成m段,每段价值为(该段最大值-该段最小值)^2,求最小的总价值. 解题思 ...
- HDU 2993 MAX Average Problem(斜率优化DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...
- HDU 3507 Print Article(斜率优化DP)
题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...
随机推荐
- Getting Started with Core Data
Getting Started with Core Data Getting Started with Core Data Coreframework支持创建对象模型封装你的应用数据和逻辑满足MVC设 ...
- 对中级 Linux 用户有用的 20 个命令
也许你已经发现第一篇文章非常的有用,这篇文章是继对初级Linux用户非常有用的20个命令的一个延伸. 第一篇文章的目的是为新手准备的而这篇文章则是为了Linux的中高级用户.在这里你将学会如何进行自定 ...
- ASP.NET MVC 之Model的呈现
ASP.NET MVC 之Model的呈现(仅此一文系列三) 本文目的 我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index: public class H ...
- window.open()详解及浏览器兼容性问题
一.基本语法:window.open(pageURL,name,parameters)其中:pageURL 为子窗口路径name 为子窗口名字parameters 为窗口参数(各参数用逗号分隔) 二 ...
- ICMP:internet 控制报文协议
ICMP:internet 控制报文协议 1.概述 ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个 ...
- JSP和JavaBean
JSP JSP全称是Java Server Pages.JSP实际上就是Servlet. JSP原理:JSP会被Tomcat翻译成一个Servlet JSP语法 1)JSP的Java脚本表达式 作用: ...
- PyQt设计流程
Qt designer 设计流程: 创建一个 PyQt4 的步骤,通常的方法是用 QtDesigner 工具创建 GUI 界面.可以在窗口 上添加部件,并可以对部件进行一些属性配置.一般的过程如下 ...
- 三千万数据量下redis2.4的一统计情况
先说一下工作场景,要求做一个服务,满足:处理千万级别数据,单个请求响应时间在20ms以下.由于是存储的数据格式为key:list[],所以很适合使用redis来存放数据,为了测试一下redis存储的效 ...
- android 豆瓣客户端 视频
链接如下:http://download.csdn.net/detail/jltxgcy/5667337
- Elasticsearch 2.3 (ELK)Geo_point绘图、日志Date时间获取实例
前言:本文源于天天是雾霾新闻,我想利用kibana画一下一线城市雾霾图,希望对想利用经纬度在kibana绘图和获取日志本身时间绘图的同学有所帮助.有什么疑问或者纠错,可以给我发邮件 一.数据准备 为了 ...