[Codeforces958E2]Guard Duty (medium)(区间DP)
Description
Solution
可以把题目转化一下模型,将间隔取出来,转化为N-1个数,限制不能取相邻两个数,求取K个数的最小价值
设DP[i][j]表示前i个数取j个最大价值(第i个数取),那么DP[i][j]=min{DP[i-1][j],DP[i-2][j-1]+d[i]}
但是,这样显然是会超时的,
考虑一个性质,在最优方案中,取的数一定是在所有数中最小的3*K个数中,最坏的情况下最小的3*K个数全部连在一起方案也在这里面
那么就可以吧O(nk)优化为O(k2)
最后滚动数组优化一下空间就好了
Code
#include <cstdio>
#include <algorithm>
#include <cstring>
#define fst first
#define sed second
#define N 500010
using namespace std; int n,k,dp[4][5010],t[N],d[N],p;
pair<int,int> A[N];
bool b[N]; inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} int main(){
k=read(),n=read();
for(int i=1;i<=n;++i) t[i]=read();
sort(t+1,t+n+1);
for(int i=1;i<n;++i) d[i]=A[i].fst=t[i+1]-t[i],A[i].sed=i;
sort(A+1,A+n);
for(int i=1;i<=min(n,3*k);++i) b[A[i].sed]=1;
memset(dp,0x3f,sizeof(dp));
for(int i=0;i<4;dp[i++][0]=0);
for(int i=1;i<n;++i){
if(!b[i]) continue;p++;
for(int j=1;j<=min(p,k);++j) dp[p&3][j]=min(dp[(p-1)&3][j],dp[(p-1-b[i-1])&3][j-1]+d[i]);
}
printf("%d\n",dp[p&3][k]);
return 0;
}
[Codeforces958E2]Guard Duty (medium)(区间DP)的更多相关文章
- [Codeforces958C2]Encryption (medium)(区间DP)
Description 题目链接 Solution 显然的区间DP,正常想法f[i][j]表示前i个数分成j块,每次在i前找一个k使得balala,然而常规打法会超时 我们发现,对于i前面的所有点,他 ...
- Codefroces 958C2 - Encryption (medium) 区间dp
转自:https://www.cnblogs.com/widsom/p/8857777.html 略有修改 题目大意: n个数,划分为k段,每一段的和mod p,求出每一段的并相加,求最大是多 ...
- CF 958E2. Guard Duty (medium)
这道题是昨天linkfqy dalao上课讲的一道题 当时他讲的时候就想到了一种玄学的搞法,然后不敢相信自己切掉了 没想到后来CHJ dalao也想到了这种算法,然后发现是对的 后来10min就切掉了 ...
- Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化
https://codeforces.com/contest/958/problem/E2 首先求出N个时刻的N-1个间隔长度,问题就相当于在这些间隔中选K个数,相邻两个不能同时选,要求和最小 方法1 ...
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 【POJ-1390】Blocks 区间DP
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5252 Accepted: 2165 Descriptio ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- BZOJ1055: [HAOI2008]玩具取名[区间DP]
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1588 Solved: 925[Submit][Statu ...
- poj2955 Brackets (区间dp)
题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...
随机推荐
- linux 封禁ip
可以直接服务配置nginx.conf 添加 deny+IP 例如: 封禁单个IP deny 106.5.76.83; #封整个段即从123.0.0.1到123.255.255.254的命令deny 1 ...
- 关于 Android Studio 如何连接手机调试
第一步:设置-> 打开开发者选项,以及USB调试模式 第二步:关于手机->版本号,点击版本号会弹出提示:已经处于开发者模式,无需操作 第三步:设置->在搜索框中输入HDB,此时会弹出 ...
- iOS 谓词(NSPredicate)的应用
Cocoa中谓词(Predicate)提供了一个通用的查询方式处理数据,可以获取和指定数据的过滤形式,Cocoa实际开发中可以是使用NSPredicate及其父类NSComparisonPredica ...
- linux基础命令-文件查看类命令cat/tac/more/less/tail/head
cat 查看文本文件内容 -b :给每一行编号不包括空白行 -n:给所有行编号 [root@host01 tmp]# cat -An /root/anaconda-ks.cfg # Kickstart ...
- 解压war包
unzip cat-alpha-3.0.0.war -d /tmp/test 说明:-d指定解压的路径和文件,文件名不存在会自动创建
- HTML5开发必备工具
现在除了移动APP开发之外,比较火的就是html5开发了,现阶段的HTML5被看做是Web开发者创建流行web应用的利器,增加了对视频和Canvas2D的支持,它的优点就是可以跨平台使用,比如你是开发 ...
- vm中efi模式安装windows10
选择dvd: 界面出现“Press any key to boot from CD or DVD”时,再迅速按下任意键就OK了.
- 使用Excel调用ABAP系统的函数
效果:在excel里创建一个按钮,开发一些VB script,可以连接指定的ABAP系统并执行系统里的ABAP function module. 在这里例子里执行ABAP系统的函数TH_USER_LI ...
- 检测pycaffe安装好没
进入python然后import caffe,如果没报错就表示安装好了
- face verification
一直没怎么思考过人脸应用上cnn是怎么回事,也曾经想当然过.这两天看些文章,才明白思路. 在人脸verification上,cnn起到的是一个特征提取作用,通过cnn提取得到features,基于这些 ...