Codeforces 571B Minimization:dp + 贪心【前后相消】
题目链接:http://codeforces.com/problemset/problem/571/B
题意:
给你一个长度为n的数列a[i]。
现在你可以随意改变数字的位置,问你 ∑| a[i] - a[i+k] | 的最小值(1 <= i <= n-k)。
题解:
将a[i]拆成若干个子序列s[j],子序列中相邻两数在a[i]中的距离为k。
此时原式 = ∑(子序列s[j]内部之差的和)
显然,要想使子序列s[j]内部之差的和尽可能小,子序列s[j]内部一定为升序。
显然,要想使 ∑(子序列s[j]内部之差的和)尽可能小,所有子序列s[j]一定是由a[i]升序排序后分割而来。
可以发现,拆出的子序列中:
有 n2 = n%k 个子序列长度为 l1 = n/k+1
有 n1 = k-n%k 个子序列长度为 l2 = n/k
此时:
原式 = ∑ (s[2]-s[1]+s[3]-s[2]+s[4]-s[3]...)
前后相消之后就是:
原式 = ∑ (s[i][end] - s[i][1])
此时题目就变成了:
先将a[i]排序,然后将a[i]分割成n1个长为l1的子串,以及n2个长为l2的子串。
让你使得 ∑ (s[i][end] - s[i][1])最小。
表示状态:
dp[i][j]
表示从头开始分割,已经分割出了i个长为l1的子串,以及j个长为l2的子串。
找出答案:
ans = dp[n1][n2]
如何转移:
if(i) dp[i][j] = min(dp[i][j], dp[i-1][j]+a[start1]-a[end1])
if(j) dp[i][j] = min(dp[i][j], dp[i][j-1]+a[start2]-a[end2])
start1/2, end1/2分别是新分割出的子串的首位与末尾。
边界条件:
dp[0][0] = 0
others = INF
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 300005
#define MAX_S 5005 using namespace std; int n,k;
int a[MAX_N];
long long dp[MAX_S][MAX_S]; int main()
{
cin>>n>>k;
for(int i=;i<=n;i++) cin>>a[i];
sort(a+,a+n+);
int n1=n%k,n2=k-n%k;
int l1=n/k+,l2=n/k;
memset(dp,0x3f,sizeof(dp));
dp[][]=;
for(int i=;i<=n1;i++)
{
for(int j=;j<=n2;j++)
{
if(i) dp[i][j]=min(dp[i][j],dp[i-][j]+a[i*l1+j*l2]-a[(i-)*l1+j*l2+]);
if(j) dp[i][j]=min(dp[i][j],dp[i][j-]+a[i*l1+j*l2]-a[i*l1+(j-)*l2+]);
}
}
cout<<dp[n1][n2]<<endl;
}
Codeforces 571B Minimization:dp + 贪心【前后相消】的更多相关文章
- Codeforces 571B Minimization
http://codeforces.com/problemset/problem/571/B 给出一个序列,可以任意调整序列的顺序,使得给出的式子的值最小 思路:我们可以把序列分解,变成k条链,n%k ...
- CodeForces 572D Minimization(DP)
题意翻译 给定数组AAA 和值kkk ,你可以重排AAA 中的元素,使得∑i=1n−k∣Ai−Ai+k∣\displaystyle\sum_{i=1}^{n-k} |A_i-A_{i+k}|i=1∑n ...
- codeforces 704B - Ant Man 贪心
codeforces 704B - Ant Man 贪心 题意:n个点,每个点有5个值,每次从一个点跳到另一个点,向左跳:abs(b.x-a.x)+a.ll+b.rr 向右跳:abs(b.x-a.x) ...
- 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心
题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...
- CodeForces - 50A Domino piling (贪心+递归)
CodeForces - 50A Domino piling (贪心+递归) 题意分析 奇数*偶数=偶数,如果两个都为奇数,最小的奇数-1递归求解,知道两个数都为1,返回0. 代码 #include ...
- BZOJ 2021 [Usaco2010 Jan]Cheese Towers:dp + 贪心
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2021 题意: John要建一个奶酪塔,高度最大为m. 他有n种奶酪.第i种高度为h[i]( ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- Codeforces Round #317 (Div. 2) D Minimization (贪心+dp)
D. Minimization time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 线段树+dp+贪心 Codeforces Round #353 (Div. 2) E
http://codeforces.com/contest/675/problem/E 题目大意:有n个车站,每个车站只能买一张票,这张票能从i+1到a[i].定义p[i][j]为从i到j所需要买的最 ...
随机推荐
- ArrayList remove注意事项
例子1: List<Integer>list=new ArrayList<>(); list.add(1); list.add(2); list.add(2); list.ad ...
- centos7 中文输入法设置
安装centos7 后,他有自带的中文输入法安装包找到 applications->systemTools->settings->region&language 2:在 in ...
- macOS 安装安卓模拟器 并用charles抓包
mac上面安装安卓模拟器并能使用charles抓包软件调研 一.Genymotion 1.先下载Virtua Box虚拟机 https://www.virtualbox.org/wiki/Downlo ...
- memcached windows 修改端口
要想在windows中使用memcached,必须先下载memcached for win32安装. 下载地址:http://jehiah.cz/projects/memcached-win32/ 解 ...
- ios 即时通讯 xmpp
[iPhone高级] 基于XMPP的IOS聊天客户端程序(XMPP服务器架构) http://blog.csdn.NET/kangx6/article/details/7739828 [iPhone高 ...
- 请求SQL数据是存在<null>,的解决方法
删除字典中的null 我们在处理服务器传过来的数据过程中,如果数据中出现null,我们是没法进行本地持久化处理的.在使用NSUserDaults保存本地时,如果其中一个字段的value为NULL值,就 ...
- 在VS中自动生成NuGet包以及搭建自己的或单位内部的NuGet服务器
关于NuGet的介绍已经很多,可以参考下面的: NuGet学习笔记(1)--初识NuGet及快速安装使用 http://kb.cnblogs.com/page/143190/ NuGet学习笔记(2) ...
- STM32F103RCT6移植到STM32F103C8T6注意事项
1,修改IC为STC32F103C8 2,修改晶振为8.0M 3,修改C/C++宏定义,由STM32F10X_HD,USE_STDPERIPH_DRIVER 改为 STM32F10X_MD,USE_S ...
- 【BZOJ1226】[SDOI2009]学校食堂Dining 状压DP
[BZOJ1226][SDOI2009]学校食堂Dining Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满 ...
- Eclipse下使用maven搭建多模块项目
暂时将项目分为如下几层: domain(域模型层).dao(数据库访问层).service(业务逻辑层).web(表现层),有需要再另行添加(如common等): 目录结构: 一.app 该层为父层, ...