把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的更多相关文章

  1. HDU 3480 DP+斜率优化

    题意:给你n个数字,然后叫你从这些数字中选出m堆,使得每一堆的总和最小,一堆的总和就是这一堆中最大值减去最小值的平方,最后要使得所有堆加起来的总和最小. 思路:对这些数字排序之后,很容易想到DP解法, ...

  2. hdu 3507(DP+斜率优化)

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  3. HDU 3045 DP 斜率优化 Picnic Cows

    题意:将n个数分成若干组,每组数字的个数不少于t个,要把每组的数字减小到这组最小值,求所有数字减少的最小值. 先将这n个数从小到大排个序,可以想到一组里面的数一定是排序后相邻的. 设d(i)表示前i个 ...

  4. HDU 3507 [Print Article]DP斜率优化

    题目大意 给定一个长度为\(n(n \leqslant 500000)\)的数列,将其分割为连续的若干份,使得 $ \sum ((\sum_{i=j}^kC_i) +M) $ 最小.其中\(C_i\) ...

  5. 【BZOJ-4518】征途 DP + 斜率优化

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 230  Solved: 156[Submit][Status][ ...

  6. 【BZOJ-3437】小P的牧场 DP + 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 705  Solved: 404[Submit][Status][Discuss ...

  7. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

  8. 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...

  9. BZOJ 1096: [ZJOI2007]仓库建设(DP+斜率优化)

    [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在 ...

随机推荐

  1. nginx之location简单匹配总结

    location匹配规则与优先级 = 精确匹配,匹配成功则停止匹配 ^~   前缀普通字符匹配,匹配成功则停止匹配 ~ 正则匹配,区分大小写:多个正则按顺序匹配 ~*   正则匹配,不区分大小写:多个 ...

  2. 一个发散动画的菜单控件(主要记录控件x,y坐标的运动状况)

    private void showCloseAnim() { int size = viewList.size(); if (size % 2 == 0) { //是偶数 for (int i = 0 ...

  3. c51中的bit,SBIT

    在51单片机的0x20~0x2f,是bdata区既可以字节寻址又可以位寻址.用法: 1 先用bdata存储类型关键字 定义变量,注意其值就是地址 .unsigned char bdata MYBITS ...

  4. bootstrap 滚动监听 标签页 和 工具提示

    标签   <div class="container">     <h4>Tabs</h4>     <ul id="myTab ...

  5. Vue实例的4个常用选项

    1.过滤器 filters:在不改变的data的情况下输出前端页面需要的格式数据.例如将小数过滤为整数等.filters是一个对象,里边定义一个function方法,function传入一个参数,fu ...

  6. GetClassName 取得的类名有

    今天上午稍微跟踪了一下自己的项目里面的各个空间,得知GetClassName可以取到以下类名:Static\Edit\Button\ComboBox\msctls_trackbar32\SysTabC ...

  7. 读懂《HTML5网页开发实例详解》这本书

    你还在用Flash嘛?帮主早不用了 乔布斯生前在公开信<Flash之我见>中预言:像HTML 5这样在移动时代中创立的新标准,将会在移动设备上获得胜利. ——国际巨头Google.苹果等都 ...

  8. 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 ...

  9. block总结

    3.编译器中的block 3.1 block的数据结构定义 我们通过大师文章中的一张图来说明: 上图这个结构是在栈中的结构,我们来看看对应的结构体定义: 1 2 3 4 5 6 7 8 9 10 11 ...

  10. Thread源码分析-java8

    1.Thread特性分析 守护线程Daemon 定性:支持性线程,主要用于程序中后台调度以及支持性工作. 当JVM中不存在Daemon线程时,JVM将会退出. 将一个线程设定为Daemon的方法: 调 ...