codevs 3327 选择数字
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
第一步:dfs
20分 TLE
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k;
long long ans;
long long a[];
void dfs(int now,long long sum,int con)
{
if(now==n)
{
ans=max(ans,sum);
return;
}
for(int i=now+;i<=n;i++)
{
if(con<k) dfs(i,sum+a[i],con+);
dfs(i,sum,);
}
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
dfs(,,);
printf("%lld",ans);
}
这种写法好像不能改记忆化搜索
第二步:朴素的DP
唉,这一步也想不出来
看的那篇题解里写着一句话:人傻就要多做题
90分TLE 应该是数据弱。。。
不能有超过连续的k个数字被选择,所以第i个状态可以由第i-k到i的状态更新而来
定义f[i]表示选到第i个数字的最大和
在i-k——i这段长为k+1的序列中,必须有一个断点
枚举断点j
状态转移方程:f[i]=max(f[j-1]+sum[i]-sum[j]) i-k<=j<=i
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k;
long long a[],f[],sum[];
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%lld",&a[i]),sum[i]=sum[i-]+a[i];
for(int i=;i<=k;i++) f[i]=f[i-]+a[i];
for(int i=k+;i<=n;i++)
for(int j=i-k;j<=i;j++)
f[i]=max(f[i],f[j-]+sum[i]-sum[j]);
printf("%lld",f[n]);
}
开始做的时候 j只枚举到i-1,忽略了选i-k——i-1这段长为k的序列的情况
第三步:
单调队列优化DP
观察状态转移方程,交换后两项顺序:f[i]=max(f[j-1]-sum[j]+sum[i])
当i固定式,sum[i]固定,所以f[i]只与j有关
所以可以用一个单调递减的队列维护f[j-1]-sum[j]的最大值,
f[i]=队首(f[j-1]-sum[j]的最大值)+sum[i]
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k,head,tail;
long long a[],f[],sum[],d[],q[];
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%lld",&a[i]),sum[i]=sum[i-]+a[i];
for(int i=;i<=n;i++)
{
d[i]=f[i-]-sum[i];
while(head<tail&&q[head]<i-k) head++;
while(head<tail&&d[i]>d[q[tail-]]) tail--;
q[tail++]=i;
f[i]=d[q[head]]+sum[i];
}
printf("%lld",f[n]);
}
codevs 3327 选择数字的更多相关文章
- codevs3327选择数字(单调队列优化)
3327 选择数字 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给定一行n个非负整数a[1]..a[n].现 ...
- P2034 选择数字
P2034 选择数字 题目描述 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 错误日志: longlong ...
- input只读属性 设置和移除 选择数字
设置只读属性 $('#stage').attr("readonly", "readonly"); 移除 只读属性 $("input").r ...
- 科普:为什么 String hashCode 方法选择数字31作为乘子
作者:coolblog 此文章转载自:https://segmentfault.com/a/1190000010799123 1. 背景 某天,我在写代码的时候,无意中点开了 String hashC ...
- P2034 选择数字——线性dp(单调队列优化)
选择数字 题目描述 给定一行 \(n\) 个非负整数 \(a[1]...a[n]\) .现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择.你的任务是使得选出的数字的和最大. 输 ...
- 「单调队列优化DP」P2034 选择数字
「单调队列优化DP」P2034 选择数字 题面描述: 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入格 ...
- 选择数字(codevs 3327)
题目描述 Description 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入描述 Input De ...
- P2034 选择数字 / P2627 [USACO11OPEN]Mowing the Lawn G
Link 题目描述 给定一行 \(n\) 个非负整数 \(a[1]..a[n]\) .现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入 ...
- Codevs 4829 [DP]数字三角形升级版
4829 [DP]数字三角形升级版 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 从数字三角形的顶部(如图,第一行的5表示行数)到底 ...
随机推荐
- Beta Scrum Day 7 — 听说
7#听说
- [图的遍历&多标准] 1087. All Roads Lead to Rome (30)
1087. All Roads Lead to Rome (30) Indeed there are many different tourist routes from our city to Ro ...
- profibus总线和profibus dp的区别
profibus总线和profibus dp的区别:PROFBUS是一种国际性的开放式的现场总线标准,它既可以用于高速并且对于时间苛求的数据传输,也可以用于大范围的复杂通讯场合.PROFBUS-DP是 ...
- 小学四则运算练习(JAVA编写)
源码在Github的仓库主页链接地址:https://github.com/rucr9/rucr 看到这个题目,大概很多人会发出“切,这也太简单了吧!有必要小题大做?”的感叹!是的,仅仅作为一道数学运 ...
- mysql 函数示例(转)
MySQL函数大全及用法示例 1.字符串函数ascii(str) 返回字符串str的第一个字符的ascii值(str是空串时返回0) mysql> select ascii('2'); ...
- 基于element-ui的后台系统表格、dialog、筛选、自定义按钮、分页的一次性封装
方便基础业务开发封装的一套组件,基于vue2.5.x和element-ui,可以通过配置自动生成表格展示,表格新增.编辑功能.分页.筛选项.自定义显示表格数据等功能. 先上演示图片 --------- ...
- 牛客OI赛制测试赛3 解题报告
前话: 话说考试描述:普及难度. 于是想在这场比赛上涨点信心. 考出来的结果:Point:480 Rank:40 然而同机房的最好成绩是 510. 没考好啊!有点炸心态,D题一些细节没有注意, ...
- web接口测试中需要测试的几个点
本文导读: web接口测试用例要包括欲测试的功能.应输入的数据和预期的输出结果,只有在数据能正确流入.流出模块的前提下,其他测试才有意义.下面介绍在web测试接口时一些需要注意的点 1.接口返回 数据 ...
- 用vim去掉utf-8 BOM
'去掉utf-8 BOM :set nobomb '保留utf-8 BOM :set bomb
- 【题解】HAOI2018染色
好坑啊不开心…… 其实这题的想法还是比较简单粗暴的.题目明示恰好xxx,显然排除斜率二分这个玩意儿,那么不就只剩下容斥了嘛…… 令 \(A_{x}\) 为恰好出现了 \(S\) 次的至少有 \(x\) ...