博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Codeforces958E2]Guard Duty (medium)(区间DP)
阅读量:6895 次
发布时间:2019-06-27

本文共 823 字,大约阅读时间需要 2 分钟。

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 
#include
#include
#define fst first#define sed second#define N 500010using namespace std;int n,k,dp[4][5010],t[N],d[N],p;pair
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

 

转载于:https://www.cnblogs.com/void-f/p/8867585.html

你可能感兴趣的文章
我的友情链接
查看>>
python 沙盒环境
查看>>
zabbix发送短信告警脚本
查看>>
js中如何快速获取数组中的最大值最小值
查看>>
易维信(EVTrust)支招五大技巧识别钓鱼网站
查看>>
揭秘腾讯大数据冰山一角
查看>>
php位运算符”|”和逻辑运算符”||”
查看>>
16-11-29
查看>>
IT人员从菜鸟到大牛的进阶之路
查看>>
新手如何快速入门Java学习?
查看>>
为什么要学习Python?
查看>>
VMWareStation 12和CentOS 6.5 三节
查看>>
关于微信小程序登陆的问题
查看>>
从零开始的linux 第六章
查看>>
ssh远程登录
查看>>
10.28 rsync工具介绍 10.29/10.30 rsync常用选项 10.31 rsync
查看>>
手机web页面制作时的注意事项
查看>>
LINUX系统服务与管理(Services)---------第二天
查看>>
微会动袁帅:会议营销是企业To B业务中最佳的获客方式
查看>>
【Docker篇之一】Docker镜像及容器
查看>>