把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. 新生代内存中为什么要有两个survivor区

    首先是关于新生代中的内存分布的描述: 新生代中的对象都是“朝生夕死”的对象,所以每次gc存活的对象很少,于是在新生代中采用的垃圾回收算法是“复制算法”. 将新生代的内存分为一块较大的Eden区域和两块 ...

  2. hdu4419Colourful Rectangle

    链接 分别求出7种颜色覆盖的面积. 做法:每种颜色设定一个标号,以二进制表示R:100 G:010 B:001 .这样很明显可以知道RG:110 GB:011 以此类推. 求解时,需要开一个二维标记数 ...

  3. spring boot使用AbstractXlsView导出excel

    一.maven依赖jar包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi ...

  4. PostgreSQL函数如何返回数据集 [转]

    PostgreSQL函数如何返回数据集 以下主要介绍PostgreSQL函数/存储过程返回数据集,或者也叫结果集的示例. 背景: PostgreSQL里面没有存储过程,只有函数,其他数据库里的这两个对 ...

  5. LINUX一网卡多IP设置

    方法1:少量IP手动绑定(这里以绑定IP到eth0为例,其它网卡的话修改相应的文件名即可) 1.复制ifcfg-eth0的网卡配置文件并改名为ifcfg-eth0:0 [root@akinlau /] ...

  6. Web开发者应掌握的12个Firebug技巧

    来源: 廖煜嵘 相信很多从事Web开发工作的开发者都听说和使用过Firebug,但可能大部分人还不知道,其实它是一个在网页设计方面功能相当强大的编辑器,它 可以对HTML.DOM.CSS.HTTP和J ...

  7. 如何使用Git Bash Here,将本地项目传到github上

    申请一个github账号 安装git bash git与git bash的区别: git:版本控制工具,支持该工具的网站有Github.BitBucket.Gitorious.国内的osChina仓库 ...

  8. Asp.net Mvc 表单验证(气泡提示)

    将ASP.NET MVC或ASP.NET Core MVC的表单验证改成气泡提示: //新建一个js文件(如:jquery.validate.Bubble.js),在所有要验证的页面引用 (funct ...

  9. core 下使用 autofac

    依赖注入小伙伴们比较常了,这里只说core 下autofac依赖注入的使用 ,不多费话,直接代码. 在 Startup.cs里 public void ConfigureServices(IServi ...

  10. Shift-Invariant论文笔记

    ICML 2019 Making Convolutional Networks Shift-Invariant Again ICML 2019 Making Convolutional Network ...