hdu1500 (排序+单调队列优化 )
从n根筷子里面, 选择k+8个集合的筷子,每个集合三根筷子, A<=B<=C, 费用是(A-B)^2,
问最小的费用是多少。
将n根筷子排序之后,可以知道A和B的下标一定是连续的。
比如有 A B C D , 那么不可能是A C 一个集合, B D一个集合, 因为这样费用反而更大。
设dp[i][j] 为第i个集合的筷子,以j结尾, 就是说 A和B分别是第j和第j-1个筷子
dp[i][j] = min(dp[i-1][k]) + (a[j]-a[j-1])^2
那么如何处理第三根筷子呢?
只要将筷子从大到小排序。
dp[i][j] 的j是从3*i开始的,
而dp[i-1][k]的k是从(i-1)*3开始的,这样就保证了每个集合在前面的筷子中,都有一根筷子与自己配对。
dp[i][j] = min(dp[i-1][k]) + (a[j]-a[j-1])^2 这个循环可以用单调递增队列来优化,保证队头最小就行了。
#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <bitset>
#include <algorithm>
#include <iostream>
#include <string>
#include <functional>
#include <unordered_map>
typedef __int64 LL;
const int INF = ; /*
A B 绝逼是连续的,问题是C怎么怎么描述
dp[i][j] 第i套筷子是由j结束 dp[i][j] = min(dp[i][j],dp[i-1][k])
*/ const int N = + ;
int a[N];
int dp[][N];
int q[N], head, tail;
int main()
{
int t, n, k;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &k, &n);
k += ;
for (int i = ;i <= n;++i)
scanf("%d", &a[i]);
std::sort(a + , a + n + ,std::greater<int>());
for (int i = ;i <= k;++i)
{
head = tail = ;
for (int j = (i-)*;j <= * i - ;++j)
{
while (head < tail && dp[i - ][q[tail - ]] >= dp[i - ][j])
tail--;
q[tail++] = j;
}
for (int j = * i; j <= n;++j)
{
dp[i][j] = (a[j] - a[j - ])*(a[j] - a[j - ]) + dp[i - ][q[head]];
while (head < tail && dp[i - ][q[tail - ]] >= dp[i - ][j-])
tail--;
q[tail++] = j - ;
}
}
int ans = INF;
for (int j = * k;j <= n;++j)
ans = std::min(ans, dp[k][j]);
printf("%d\n", ans); }
return ;
}
hdu1500 (排序+单调队列优化 )的更多相关文章
- poj 1821 Fence 单调队列优化dp
/* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...
- Codeforces 445A Boredom(DP+单调队列优化)
题目链接:http://codeforces.com/problemset/problem/455/A 题目大意:有n个数,每次可以选择删除一个值为x的数,然后值为x-1,x+1的数也都会被删除,你可 ...
- POJ - 1821 单调队列优化DP + 部分笔记
题意:n个墙壁m个粉刷匠,每个墙壁至多能被刷一次,每个粉刷匠要么不刷,要么就粉刷包含第Si块的长度不超过Li的连续墙壁(中间可不刷),每一块被刷的墙壁都可获得Pi的利润,求最大利润 避免重复粉刷: 首 ...
- $Poj1821\ Fence\ $单调队列优化$DP$
Poj Acwing Description 有N块木板等待被M个工匠粉刷,每块木板至多被刷一次.第i个工匠要么不粉刷,要么粉刷包含木块Si的,长度不超过Li的连续的一段木板,每粉刷一块可以得到P ...
- 单调队列优化O(N)建BST P1377 [TJOI2011]树的序
洛谷 P1377 [TJOI2011]树的序 (单调队列优化建BST 链接 题意分析 本题思路很简单,根据题意,我们利用所给的Bst生成序将Bst建立起来,然后输出该BST的先序遍历即可: 但,如果我 ...
- poj1821 Fence(dp,单调队列优化)
题意: 由k(1 <= K <= 100)个工人组成的团队应油漆围墙,其中包含N(1 <= N <= 16 000)个从左到右从1到N编号的木板.每个工人i(1 <= i ...
- [DP浅析]线性DP初步 - 2 - 单调队列优化
目录 #0.0 前置知识 #1.0 简单介绍 #1.1 本质 & 适用范围 #1.2 适用方程 & 条件 #2.0 例题讲解 #2.1 P3572 [POI2014]PTA-Littl ...
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
随机推荐
- linux公社的大了免费在线android资料
2011年linux数据库的android在线分享 linux公社:开源公社 本文撰写:杨凯专属频道 2011年9月12日 21:39 <目录> Android 3 ...
- csdn的登录框好难看
不好意思说实话了,新的登陆框样式挺难看的,那种橙不明朗,介于黄和橙之间,跟整个网站主色调红和黑很不搭.不过,倒是有点跟风Win8平实的style,但是比Win8更简陋了点. tooltip要不加都不加 ...
- timeout connect 10000 # default 10 second time out if a backend is not found
timeout connect <timeout> timeout contimeout <timeout> (deprecated) Set the maximum time ...
- c/c++ extern “C”
c/c++ extern “C” 常见的样式 extern “C”{ ... } extern "C" return-type func-name(type , type ){} ...
- Org-mode五分钟教程ZZZ - Kaka Abel的日志 - 网易博客
Org-mode五分钟教程ZZZ - Kaka Abel的日志 - 网易博客 Org-mode五分钟教程ZZZ
- qt 获取windows 的消息(通过MFC的DLL的透明窗体转发消息)good
qt 给win32 发送消息很简单,但是要获取windows 消息却十分复杂,最后想了一个不是很完美 但是也是以现在本人能力所能实现的唯一途径了,基本原理是 利用vc编写一个mfc 的dll ,这个d ...
- [C++]C++中的运行时类型检测
Date:2014-1-3 Summary: 使用C++中的运行时类型检测.(文章重点在于记录本人的使用情况,并非深层讨论RTTI) Contents:写习惯C#的我,在C++依然存在哪些.NET的惯 ...
- Java学习笔记——File类之文件管理和读写操作、下载图片
Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据.Android系统给我们提供了Content P ...
- Oracle 调用存储过程执行CRUD的小DEMO
-----------------------------修改(表名,主键ID,要修改的列) create or replace procedure pro_code_edit(p_tbname in ...