题意:给你一个n个元素的数组,从中选取x个元素,并且要保证任意的m个位置中必须至少有一个元素被选中,问选中元素的和最大可以是多少?

F1 n,m,x到200 F2 n,m,x到5000。

思路1:设dp[i][j]为选择i位置的元素,并且包括i位置已经选择了j个元素,所有选中元素的最大和。

那么为了保证方案的合法性,只能从i-m+1的地方状态转移,dp[i][j]=max(dp[k][j-1])+a[i] (i-m+1<=k<i);,意思是找从i-m+1位置到i-1位置找已经选区j-1个元素中和最大的一个,在加上自己。

最后在n-m+1到i中找最大值就是答案,这些点因为已经被选取,所以保证了最终答案的合法性。

代码:

#include<bits/stdc++.h>
using namespace std;
long long dp[210][210],a[210];
int main(){
int n,m,x;
scanf("%d%d%d",&n,&m,&x);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
int tmp=n-(m-1);
if((tmp/m+(tmp%m!=0))>x){
printf("-1\n");
return 0;
}
int lim=1;
for(int i=1;i<=n;i++){
for(int j=lim;j<=min(i,x);j++){
for(int k=max(0,i-m);k<i;k++){
dp[i][j]=max(dp[k][j-1]+a[i],dp[i][j]);
}
}
if(i%m==0)lim++;
} long long ans=0;
for(int i=n-m+1;i<=n;i++)
ans=max(ans,dp[i][x]);
printf("%lld\n",ans);
}

思路2:现在数据规模变大了,原来的做法可以卡成O(n3),过不了。仔细观察状态转移过程,会发现有很多无用的状态,比如dp[i][j-1]<dp[k][j-1] (i<k),dp[i][j-1]这个状态肯定不会成为更新的跳板,于是我们就可以用单调队列优化。

外层循环枚举选取的元素个数,内层循环枚举数组的元素,用单调队列的队头更新最优解,此时dp[i][j]表示已经选区了i个元素,第j个元素已经被选的最优解,单调队列的队头出队过程保证了方案的合法性。

代码:

#include<bits/stdc++.h>
using namespace std;
long long dp[2][5010],a[5010];
int q[100010],l=1,r=0;
int main(){
int n,m,x;
scanf("%d%d%d",&n,&m,&x);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
int tmp=n-(m-1);
if((tmp/m+(tmp%m!=0))>x){
printf("-1\n");
return 0;
}
memset(dp,-0x3f,sizeof(dp));
dp[1][0]=0;
int now=0;
for(int i=1;i<=x;i++){
l=1,r=0;
q[++r]=0;
for(int j=1;j<=n;j++){
while(l<=r&&q[l]+m<j)l++;
dp[now][j]=dp[now^1][q[l]]+a[j];
while(l<=r&&dp[now^1][q[r]]<=dp[now^1][j])r--;
q[++r]=j;
}
now^=1;
}
now^=1;
long long ans=-1;
for(int i=n-m+1;i<=n;i++)
ans=max(ans,dp[now][i]);
printf("%lld\n",ans);
}

  

---恢复内容结束---

Codeforces 1077(F1+F2) DP 单调队列的更多相关文章

  1. Codeforces 445A Boredom(DP+单调队列优化)

    题目链接:http://codeforces.com/problemset/problem/455/A 题目大意:有n个数,每次可以选择删除一个值为x的数,然后值为x-1,x+1的数也都会被删除,你可 ...

  2. [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)

    DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...

  3. DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)

    codevs 1748 瑰丽华尔兹 2005年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Descripti ...

  4. 习题:烽火传递(DP+单调队列)

    烽火传递[题目描述]烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有n个烽火台,每个烽火台 ...

  5. (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列

    Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...

  6. 3622 假期(DP+单调队列优化)

    3622 假期 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题目描述 Description 经过几个月辛勤的工作,FJ决定让奶牛放假.假期可以在1-N天内任意选择 ...

  7. Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)

    题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ...

  8. Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF980F.html 题目传送门 - CF980F 题意 给定一个 $n$ 个节点 $m$ 条长为 $1$ 的边 ...

  9. 【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces

    题目大意 一条街道有$n$个区域. 从左到右编号为$1$到$n$. 相邻区域之间的距离为$1$. 在节日期间,有$m$次烟花要燃放. 第$i$次烟花燃放区域为$a_i$ ,幸福属性为$b_i$,时间为 ...

随机推荐

  1. javascript-DOM操作-留言板制作

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. redhat linux 中设置网卡固定ip

    更改 /etc/sysconfig/network-scripts/ifcfg-eth0(第一个网卡为eth0) DEVICE=eth0#网卡设备名称 ONBOOT=yes#启动时是否激活 yes | ...

  3. New Concept English three (55)

    28w/m 45errors Recent developments in astronomy have made it possible to detect planets in our won M ...

  4. list的内存分配机制分析

    该程序演示了list在内存分配时候的问题.里面的备注信息是我的想法. /* 功能说明: list的内存分配机制分析. 代码说明: list所管理的内存地址可以是不连续的.程序在不断的push_back ...

  5. ipad与iphone的屏幕分辨率

    1.ipad分辨率,iphone 6 iPhone设备      尺寸 分辨率                   点iPhone 3和3s  3.5英寸    (320×480)         3 ...

  6. Logstash详解之——input模块

    原文地址 Logstash由三个组件构造成,分别是input.filter以及output.我们可以吧Logstash三个组件的工作流理解为:input收集数据,filter处理数据,output输出 ...

  7. 8、Selenium+python安装HTMLTestRunner插件

    1.打开网址:http://tungwaiyip.info/software/HTMLTestRunner.html,下载HTMLTestRunner.py 2.copy其HTMLTestRunner ...

  8. 利用PowerDesigner设计数据库

    PowerDesigner非常强大, 可以利用它完成数据库的设计. 1.下载地址:http://pan.baidu.com/s/1DsLrg 2.表设计: 建立概念数据模型(Conceptual Da ...

  9. 蓝桥杯 算法训练 ALGO-140 P1101

    算法训练 P1101 时间限制:1.0s 内存限制:256.0MB    有一份提货单,其数据项目有:商品名(MC).单价(DJ).数量(SL).定义一个结构体prut,其成员是上面的三项数据.在主函 ...

  10. POJ2976(最大化平均值)

    Dropping tests Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9329   Accepted: 3271 De ...