codevs3327选择数字(单调队列优化)
3327 选择数字
给定一行n个非负整数a[1]..a[n]。现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择。你的任务是使得选出的数字的和最大。
第一行两个整数n,k
以下n行,每行一个整数表示a[i]。
输出一个值表示答案。
5 2
1
2
3
4
5
12
对于20%的数据,n <= 10
对于另外20%的数据, k = 1
对于60%的数据,n <= 1000
对于100%的数据,1 <= n <= 100000,1 <= k <= n,
0 <= 数字大小 <= 1,000,000,000
90分代码(其实数据弱,能A的,只是我太弱2333):
/*
f[i]表示前i个数选k个的最大值
因为不能连续k个选,所以枚举一下断点
但这个题貌似是个单调队列优化......
嗯,,,那就学吧
先上个暴力dp
*/ #include<iostream>
#include<cstdio>
#define maxn 10000001 using namespace std; int n,m,k;
int f[maxn],s[maxn],a[maxn]; int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
s[i]=s[i-]+a[i];
}
for(int i=;i<k;i++)
f[i]=s[i];
for(int i=k;i<=n;i++)
for(int j=i-k;j<=i;j++)
{
f[i]=max(f[i],f[j-]+s[i]-s[j]);
}
printf("%d\n",f[n]);
}
心若向阳,无谓悲伤
单调队列优化:
/*
考虑从第一位开始递推处理
在第i位的时候,需要在i-k位(取i-k+1到i)到i(不取i)中找一个点不取
设这个点为j,这一段连续的就是j+1到i
那么f[i] = max{f[j-1] + sum[j+1, i]} (i-k<=j<=i)
运用前缀和简化一下就是f[i] = max{f[j-1]-sum[j]+sum[i]}+f[i];
发现max里面的值只与j有关,所以可以用单调队列优化转移。
*/ #include<iostream>
#include<cstdio>
#define LL long long
#define maxn 100010 using namespace std;
LL n,k,a[maxn],s[maxn],f[maxn];
LL head,tail=,d[maxn],q[maxn]; LL que(LL j)
{
d[j]=f[j-]-s[j];
while(head<=tail&&d[q[tail]]<d[j]) tail--;
q[++tail]=j;
while(head<=tail&&q[head]<j-k) head++;
return d[q[head]];
} int main()
{
scanf("%lld%lld",&n,&k);
for(LL i=;i<=n;i++)
scanf("%lld",&a[i]),s[i]=s[i-]+a[i];
for(LL i=;i<=n;i++)
{
LL t=-;
f[i]=que(i)+s[i];
}
cout<<f[n];
return ;
}
心若向阳,无言悲伤
codevs3327选择数字(单调队列优化)的更多相关文章
- 「单调队列优化DP」P2034 选择数字
「单调队列优化DP」P2034 选择数字 题面描述: 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入格 ...
- Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)
题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ...
- 【单调队列优化dp】 分组
[单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...
- 洛谷P3975 跳房子 [DP,单调队列优化,二分答案]
题目传送门 跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一 ...
- Luogu 2627 修建草坪 (动态规划Dp + 单调队列优化)
题意: 已知一个序列 { a [ i ] } ,求取出从中若干不大于 KK 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看 ...
- BZOJ 3126 [USACO2013 Open]Photo (单调队列优化DP)
洛谷传送门 题目大意:给你一个长度为$n$的序列和$m$个区间,每个区间内有且仅有一个1,其它数必须是0,求整个序列中数字1最多的数量 神题,竟然是$DP$ 定义$f_{i}$表示第i位放一个1时,最 ...
- [NOIP2017普及组]跳房子(二分,单调队列优化dp)
[NOIP2017普及组]跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 nn 个格子, ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- Codeforces 445A Boredom(DP+单调队列优化)
题目链接:http://codeforces.com/problemset/problem/455/A 题目大意:有n个数,每次可以选择删除一个值为x的数,然后值为x-1,x+1的数也都会被删除,你可 ...
随机推荐
- 洛谷——P1404 平均数
P1404 平均数 题目描述 给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m. 前缀和+二分答案 #include<iostream> ...
- MySQL Docker方式安装
以5.7版本为例 1 配置mysql配置文件编辑/etc/my.cnf,添加以下内容: [mysqld] skip-host-cache skip-name-resolve datadir=/var/ ...
- 洛谷 3870 [TJOI2009]开关
[题解] 线段树基础题.对于每个修改操作把相应区间的sum改为区间长度-sum即可. #include<cstdio> #include<algorithm> #include ...
- flask——CSRFToken保护
根据 csrf_token 校验原理,具体操作步骤有以下几步: 1.后端生成 csrf_token 的值,在前端请求登录或者注册界面的时候将值传给前端,传给前端的方式可能有以下两种: 在模板中的 Fr ...
- Maven_在Eclipse中执行Maven命令
- Spark在Executor上的内存分配
spark.serializer (default org.apache.spark.serializer.JavaSerializer ) 建议设置为 org.apache.spark.ser ...
- Ubuntu 16.04安装Adobe AIR
安装: wget -O adobe-air.sh http://drive.noobslab.com/data/apps/AdobeAir/adobe-air.sh chmod +x adobe-ai ...
- ORA_ROWSCN
这是一个非常重要的特性.从oracle10g开始,oracle在表上引入了一个伪列ORA_ROWSCN.该列记录了每一列最后更改的SCN.但是有两种模式,一种是默认的是data block级别,另一种 ...
- socket短连接、长连接
通常短连接是这样:连接->传输数据->关闭连接那什么是长连接?一般长连接相对短连接而言的,长连接在传输结束后不关闭连接,而不断的发送包保持连接等待处理下一个数据包. 一般长连接用于少数cl ...
- [Vue-rx] Disable Buttons While Data is Loading with RxJS and Vue.js
Streams give you the power to handle a "pending" state where you've made a request for dat ...