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公司一般把产品直接堆放在 ...
随机推荐
- python入门之数据类型之字符串
str方法 name.capitalize() 将name的首字母大写 name.center(20,'*') 将name居中,长度变为20,其余用*填充 name.count('chy') 返回na ...
- ZOJ How Many Nines 模拟 | 打表
How Many Nines Time Limit: 1 Second Memory Limit: 65536 KB If we represent a date in the format ...
- Django blog项目知识点总结
数据库操作部分 当我们在Django项目中的models.py下写好创建表的代码后.为了创建好这些数据库表,我们再一次请出我的工程管理助手 manage.py.激活虚拟环境,切换到 manage.py ...
- android开发学习 ------- 【转】 android中的线程池
线程很常见 , https://blog.csdn.net/seu_calvin/article/details/52415337 参考,保证能看懂.
- tomcat在idea中启动乱码
server,localhost log,catalina log分别乱码 打开tomcat/conf/目录下修改logging.properties 找到"utf-8"行更改为 ...
- leetcode287 Find the Duplicate Number
思路: 转换成链表之后使用floyed判环法.转换之后重复的那个数字是唯一一个有多个前驱和一个后继的节点,因此是环的起始节点. 实现: class Solution { public: int fin ...
- error: stray '\343' in program 问题解决
当我们从网上copy一段代码后,总会出现这个问题.博主在Arduino环境中也出现了,so,这个问题应该是C语言和C++编译器中才会出现的. test_int:19: error: str ...
- java实现打开Windows控制台窗口
在写Python程序的时候突发奇想了一下,能不能用java代码实现打开控制台窗口呢? 经过查询网络资料和java API文档,终于实现了: package com.primeton.cmd; impo ...
- XPath基本使用
一.简介 1.什么是XPath 1)XPath是W3C的一个标准 2)XPath 是一门在 XML 文档中查找信息的语言. 3)XPath 用于在 XML 文档中通过元素和属性进行导航. 4)XPa ...
- POJ 1998 Cube Stacking
Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes ...