3327 选择数字

 时间限制: 1 s
 空间限制: 256000 KB

题目描述 Description

给定一行n个非负整数a[1]..a[n]。现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择。你的任务是使得选出的数字的和最大。

输入描述 Input Description

第一行两个整数n,k

以下n行,每行一个整数表示a[i]。

输出描述 Output Description

输出一个值表示答案。

样例输入 Sample Input

5 2

1

2

3

4

5

样例输出 Sample Output

12

数据范围及提示 Data Size & Hint

对于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 选择数字的更多相关文章

  1. codevs3327选择数字(单调队列优化)

    3327 选择数字  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond     题目描述 Description 给定一行n个非负整数a[1]..a[n].现 ...

  2. P2034 选择数字

    P2034 选择数字 题目描述 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 错误日志: longlong ...

  3. input只读属性 设置和移除 选择数字

    设置只读属性 $('#stage').attr("readonly", "readonly"); 移除 只读属性  $("input").r ...

  4. 科普:为什么 String hashCode 方法选择数字31作为乘子

    作者:coolblog 此文章转载自:https://segmentfault.com/a/1190000010799123 1. 背景 某天,我在写代码的时候,无意中点开了 String hashC ...

  5. P2034 选择数字——线性dp(单调队列优化)

    选择数字 题目描述 给定一行 \(n\) 个非负整数 \(a[1]...a[n]\) .现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择.你的任务是使得选出的数字的和最大. 输 ...

  6. 「单调队列优化DP」P2034 选择数字

    「单调队列优化DP」P2034 选择数字 题面描述: 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入格 ...

  7. 选择数字(codevs 3327)

    题目描述 Description 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入描述 Input De ...

  8. P2034 选择数字 / P2627 [USACO11OPEN]Mowing the Lawn G

    Link 题目描述 给定一行 \(n\) 个非负整数 \(a[1]..a[n]\) .现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入 ...

  9. Codevs 4829 [DP]数字三角形升级版

    4829 [DP]数字三角形升级版 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 从数字三角形的顶部(如图,第一行的5表示行数)到底 ...

随机推荐

  1. Beta Scrum Day 7 — 听说

    7#听说

  2. [图的遍历&多标准] 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 ...

  3. profibus总线和profibus dp的区别

    profibus总线和profibus dp的区别:PROFBUS是一种国际性的开放式的现场总线标准,它既可以用于高速并且对于时间苛求的数据传输,也可以用于大范围的复杂通讯场合.PROFBUS-DP是 ...

  4. 小学四则运算练习(JAVA编写)

    源码在Github的仓库主页链接地址:https://github.com/rucr9/rucr 看到这个题目,大概很多人会发出“切,这也太简单了吧!有必要小题大做?”的感叹!是的,仅仅作为一道数学运 ...

  5. mysql 函数示例(转)

    MySQL函数大全及用法示例 1.字符串函数ascii(str)   返回字符串str的第一个字符的ascii值(str是空串时返回0)  mysql> select ascii('2');   ...

  6. 基于element-ui的后台系统表格、dialog、筛选、自定义按钮、分页的一次性封装

    方便基础业务开发封装的一套组件,基于vue2.5.x和element-ui,可以通过配置自动生成表格展示,表格新增.编辑功能.分页.筛选项.自定义显示表格数据等功能. 先上演示图片 --------- ...

  7. 牛客OI赛制测试赛3 解题报告

    前话: 话说考试描述:普及难度. 于是想在这场比赛上涨点信心. 考出来的结果:Point:480     Rank:40 然而同机房的最好成绩是 510. 没考好啊!有点炸心态,D题一些细节没有注意, ...

  8. web接口测试中需要测试的几个点

    本文导读: web接口测试用例要包括欲测试的功能.应输入的数据和预期的输出结果,只有在数据能正确流入.流出模块的前提下,其他测试才有意义.下面介绍在web测试接口时一些需要注意的点 1.接口返回 数据 ...

  9. 用vim去掉utf-8 BOM

    '去掉utf-8 BOM :set nobomb '保留utf-8 BOM :set bomb

  10. 【题解】HAOI2018染色

    好坑啊不开心…… 其实这题的想法还是比较简单粗暴的.题目明示恰好xxx,显然排除斜率二分这个玩意儿,那么不就只剩下容斥了嘛…… 令 \(A_{x}\) 为恰好出现了 \(S\) 次的至少有 \(x\) ...