HDU 3480 DP 斜率优化 Division
把n个数分成m段,每段的值为(MAX - MIN)2,求所能划分得到的最小值。
依然是先从小到大排个序,定义状态d(j, i)表示把前i个数划分成j段,所得到的最小值,则有状态转移方程:
d(j, i) = min { d(j-1, k) + (ai - ak+1)2 | 0 ≤ k < i }
设 l < k < i,且由k转移得到的状态比由l转移得到的状态更优。
有不等式:
整理成斜率形式:
后面的就可以相当于套模板了,不过这里要用滚动数组优化一下空间。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
const int maxm = + ;
const int INF = 0x3f3f3f3f; int n, m; int a[maxn];
int d[][maxn]; int head, tail;
int Q[maxn]; int cur; int inline Y(int x) { return d[cur^][x] + a[x+] * a[x+]; } int inline DY(int p, int q) { return Y(q) - Y(p); } int inline DX(int p, int q) { return a[q+] - a[p+]; } int main()
{
freopen("in.txt", "r", stdin); int T; scanf("%d", &T);
for(int kase = ; kase <= T; kase++)
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) scanf("%d", a + i);
sort(a + , a + + n); memset(d[], 0x3f, sizeof(d[]));
d[][] = ;
cur = ;
for(int i = ; i <= m; i++)
{
cur ^= ;
head = tail = ;
Q[tail++] = ;
for(int j = ; j <= n; j++)
{
while(head + < tail && DY(Q[head], Q[head+]) <= DX(Q[head], Q[head+]) * * a[j]) head++;
while(head + < tail && DY(Q[tail-], j) * DX(Q[tail-], Q[tail-]) <= DY(Q[tail-], Q[tail-]) * DX(Q[tail-], j)) tail--;
Q[tail++] = j;
d[cur][j] = d[cur^][Q[head]] + (a[j]-a[Q[head]+]) * (a[j]-a[Q[head]+]);
}
}
printf("Case %d: %d\n", kase, d[cur][n]);
} return ;
}
代码君
下面是四边形不等式优化的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
const int maxm = + ;
const int INF = 0x3f3f3f3f; int n, m; int a[maxn];
int d[maxm][maxn], s[maxm][maxn]; int main()
{
int T; scanf("%d", &T);
for(int kase = ; kase <= T; kase++)
{
scanf("%d%d", &n, &m); for(int i = ; i <= n; i++) scanf("%d", a + i);
sort(a + , a + + n); memset(s, , sizeof(s));
for(int i = ; i <= m; i++)
{
int j;
for(j = ; j <= i; j++) d[i][j] = ;
for(; j <= n; j++) d[i][j] = INF;
} for(int i = ; i <= n; i++)
{
s[][i] = ;
d[][i] = (a[i] - a[]) * (a[i] - a[]);
} for(int i = ; i <= m; i++)
{
s[i][n+] = n;
for(int j = n; j > i; j--)
{
for(int k = s[i-][j]; k <= s[i][j+]; k++)
{
int t = d[i-][k] + (a[j] - a[k+]) * (a[j] - a[k+]);
if(t < d[i][j])
{
d[i][j] = t;
s[i][j] = k;
}
}
}
} printf("Case %d: %d\n", kase, d[m][n]);
} return ;
}
代码君
HDU 3480 DP 斜率优化 Division的更多相关文章
- HDU 3480 DP+斜率优化
题意:给你n个数字,然后叫你从这些数字中选出m堆,使得每一堆的总和最小,一堆的总和就是这一堆中最大值减去最小值的平方,最后要使得所有堆加起来的总和最小. 思路:对这些数字排序之后,很容易想到DP解法, ...
- hdu 3507(DP+斜率优化)
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- HDU 3045 DP 斜率优化 Picnic Cows
题意:将n个数分成若干组,每组数字的个数不少于t个,要把每组的数字减小到这组最小值,求所有数字减少的最小值. 先将这n个数从小到大排个序,可以想到一组里面的数一定是排序后相邻的. 设d(i)表示前i个 ...
- HDU 3507 [Print Article]DP斜率优化
题目大意 给定一个长度为\(n(n \leqslant 500000)\)的数列,将其分割为连续的若干份,使得 $ \sum ((\sum_{i=j}^kC_i) +M) $ 最小.其中\(C_i\) ...
- 【BZOJ-4518】征途 DP + 斜率优化
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 230 Solved: 156[Submit][Status][ ...
- 【BZOJ-3437】小P的牧场 DP + 斜率优化
3437: 小P的牧场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 705 Solved: 404[Submit][Status][Discuss ...
- 【BZOJ-1010】玩具装箱toy DP + 斜率优化
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8432 Solved: 3338[Submit][St ...
- 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)
http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...
- BZOJ 1096: [ZJOI2007]仓库建设(DP+斜率优化)
[ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在 ...
随机推荐
- nginx之location简单匹配总结
location匹配规则与优先级 = 精确匹配,匹配成功则停止匹配 ^~ 前缀普通字符匹配,匹配成功则停止匹配 ~ 正则匹配,区分大小写:多个正则按顺序匹配 ~* 正则匹配,不区分大小写:多个 ...
- 一个发散动画的菜单控件(主要记录控件x,y坐标的运动状况)
private void showCloseAnim() { int size = viewList.size(); if (size % 2 == 0) { //是偶数 for (int i = 0 ...
- c51中的bit,SBIT
在51单片机的0x20~0x2f,是bdata区既可以字节寻址又可以位寻址.用法: 1 先用bdata存储类型关键字 定义变量,注意其值就是地址 .unsigned char bdata MYBITS ...
- bootstrap 滚动监听 标签页 和 工具提示
标签 <div class="container"> <h4>Tabs</h4> <ul id="myTab ...
- Vue实例的4个常用选项
1.过滤器 filters:在不改变的data的情况下输出前端页面需要的格式数据.例如将小数过滤为整数等.filters是一个对象,里边定义一个function方法,function传入一个参数,fu ...
- GetClassName 取得的类名有
今天上午稍微跟踪了一下自己的项目里面的各个空间,得知GetClassName可以取到以下类名:Static\Edit\Button\ComboBox\msctls_trackbar32\SysTabC ...
- 读懂《HTML5网页开发实例详解》这本书
你还在用Flash嘛?帮主早不用了 乔布斯生前在公开信<Flash之我见>中预言:像HTML 5这样在移动时代中创立的新标准,将会在移动设备上获得胜利. ——国际巨头Google.苹果等都 ...
- COGS 1427. zwei
★☆ 输入文件:zwei.in 输出文件:zwei.out 简单对比时间限制:1 s 内存限制:256 MB [样例输入] 5 5 1 2 3 4 5 1 1 3 1 3 5 0 ...
- block总结
3.编译器中的block 3.1 block的数据结构定义 我们通过大师文章中的一张图来说明: 上图这个结构是在栈中的结构,我们来看看对应的结构体定义: 1 2 3 4 5 6 7 8 9 10 11 ...
- Thread源码分析-java8
1.Thread特性分析 守护线程Daemon 定性:支持性线程,主要用于程序中后台调度以及支持性工作. 当JVM中不存在Daemon线程时,JVM将会退出. 将一个线程设定为Daemon的方法: 调 ...