hdu3480 Division(斜率优化+二维DP)
来源:互联网 发布:chrome for windows 编辑:程序博客网 时间:2024/05/17 22:08
点击打开链接
题意:给你一些数,把这些数分成M组,每组的花费是这组的 (max-min)^2。求最小花费
思路:
斜率优化+二维DP
f[i][m] 表示将前i个分作m个集合所得最小消费
首先应该排序,假设1,2,3,5,4 第四个数是5,花费一定比是4大。【贪心】
f[i][m] = min{f[j][m-1]+(a[i]-a[j+1])*(a[i]-a[j+1])}; 排序是为了让a[i]-a[j+1]总是最小的
若有j>k,且决策j优于决策k则有:
f[j][j-1]-f[k][j-1]+sq(a[j+1])-sq(a[k+1]) <= 2*(a[j+1]-a[k+1])*a[i]
先进行m循环枚举f[][m],每一层维护一个单调队列即可。
乘除耗费时间悬殊,如果直接除这个题就超时了。
代码:
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define mem(a) memset(a,0,sizeof(a))#define mp(x,y) make_pair(x,y)const int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}//////////////////////////////////////////////////////////////////////////const int maxn = 1e4+10;int n,M;int a[maxn],f[maxn][5005],q[maxn];int getup(int j,int k,int m){return f[j][m-1]-f[k][m-1]+a[j+1]*a[j+1]-a[k+1]*a[k+1];}int getdown(int j,int k,int m){return 2*(a[j+1]-a[k+1]);}int main(){int T=read();for(int cas=1; cas<=T; cas++){n=read(),M=read();for(int i=1; i<=n; i++)a[i]=read();sort(a+1,a+1+n);for(int i=1; i<=n; i++) f[i][1] = (a[i]-a[1])*(a[i]-a[1]);for(int m=2; m<=M; m++){int L=0,R=0;for(int i=1; i<=n; i++){while(L<R && getup(q[L+1],q[L],m) <= a[i]*getdown(q[L+1],q[L],m)) L++;int j = q[L];f[i][m] = f[j][m-1]+(a[i]-a[j+1])*(a[i]-a[j+1]);while(L<R && getup(i,q[R],m)*getdown(q[R],q[R-1],m) <= getup(q[R],q[R-1],m)*getdown(i,q[R],m)) R--;q[++R] = i;}}cout << "Case " << cas << ": " << f[n][M] << endl;} return 0;}
0 0
- hdu3480 Division(斜率优化+二维DP)
- hdu3480之二维斜率优化DP
- hdu3480 斜率优化dp
- HDU-3480 Division 【DP+斜率优化(二维)】
- Hdu3480 Division dp+四边形不等式优化
- 【HDU3480】Division-DP+四边形不等式优化+贪心
- HDOJ 3480 Division(斜率优化DP)
- hdu3480(斜率dp)
- Division (斜率dp)
- hdu 3480 Division(斜率优化DP)
- HDU 3480 Division 斜率优化DP
- hdu-3480-Division-dp-斜率优化
- hdu 3480 Division 斜率优化dp
- dp斜率优化 Hdu 3480 Division 题解
- [HDU3480] Division
- hdu3480 Division
- HDU 3480 Division (斜率DP)
- 斜率优化 hdu3480 pku3709 pku1180 pku2180
- ThinkPHP5 学习笔记
- 剑指Offer—— 二维数组中的查找
- mos管的两种接法
- CentOS下配置Lua运行环境
- PowerDesign中设置Columns的default值
- hdu3480 Division(斜率优化+二维DP)
- java IO学习心得
- linux查看日志技巧
- Arduino Uno 使用TCS3200D颜色传感器 分辨颜色
- HDU 4001 To Miss Our Children Time(DAG上的动态规划)
- java中自带的collections排序
- 记录NoHttp和Glide对HTTPS支持的过程
- 【webapp】开发手机版WEBAPP MOBILE APP
- vc++实现反射式数据库模版(3.序列化、反序列化与消息映射)