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的数也都会被删除,你可 ...
随机推荐
- Oracle 数据库启动与关闭 各种方式详解整理
概述 只有具备sysdba和sysoper系统特权的用户才能启动和关闭数据库. 在启动数据库之前应该启动监听程序,否则就不能利用命令方式来管理数据库,包括启动和关闭数据库. 虽然数据库正常运行,但如果 ...
- Go:函数、defer
一.函数可赋值给一个变量 示例1: package main import "fmt" func add(a, b int) int { return a + b } func m ...
- SQL学习笔记:基础SQL语句
目录 语句特点 进入数据库 基本查询语句 SELECT DISTINCT WHERE AND/OR/NOT :逻辑运算符 ORDER BY :排序 基本修改语句 INSERT:添加语句 UPDATE: ...
- POJ2774:Long Long Message
问两个串的最长公共子串,n<=100000. SAM可以直接搞当然SA哈希都可以..类似于KMP的做法,如果沿parent边走要顺势修改匹配位置. #include<stdio.h> ...
- pij——1125 Stockbroker Grapevine
Stockbroker Grapevine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37154 Accepted: ...
- Spring-data-jpa 笔记(一)
Spring Data JPA简介: 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现,引用 JPQL(Java Persistence Query L ...
- 20、Java并发性和多线程-Slipped Conditions
以下内容转自http://ifeve.com/slipped-conditions/: 所谓Slipped conditions,就是说, 从一个线程检查某一特定条件到该线程操作此条件期间,这个条件已 ...
- Windows下React Native开发01 -- Android开发环境搭建
1.安装jdk 推荐将JDK的bin目录加入系统PATH环境变量(自己百度下怎么配置). 2.安装SDK 直接安装 Android Studio 推荐从AndroidDevTools下载.(也可以直 ...
- 中文在C/C++中的处理和汉字乱码问题(wchar_t)
中文字在C/C++中的处理 现在编程的语言和编程环境随着中国的发展開始对中文有进一步的支持.可是对中文的支持整体来说是有缺陷的,并且有与编译环境的不同导致中文在当前的C/C++中有非常多问题,并且非常 ...
- 小议:怎样解决创建Web Application失败问题?
我们都知道微软建议部署SharePoint2013环境的内存至少是12GB.可是有些小型企业在部署On Premise的环境时因为预算有限,仅仅能使用内存是8GB的环境来部署SharePoint201 ...