最大连续子序列问题(tyvj1305)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大连续子序列问题(tyvj1305)相关的知识,希望对你有一定的参考价值。

描述 Description
输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大。
例如 1,-3,5,1,-2,3
当m=4时,S=5+1-2+3=7
当m=2或m=3时,S=5+1=6
输入格式 Input Format
第一行两个数n,m
第二行有n个数,要求在n个数找到最大子序和
输出格式 Output Format
一个数,数出他们的最大子序和

我的代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
long k[300005],a[300005],maxn=0,n,m,l=1;//l为队列头指针
int main()

scanf("%ld%ld",&n,&m);
for(int i=1;i<=n;i++)

scanf("%ld",&a[i]);
k[i]=k[i-1]+a[i];
if(i-l>=m)k[i]-=a[l];l++;
while(a[l]<=0&&l<=i)k[i]-=a[l];l++;
if(k[i]<0)k[i]=0;l=i+1;
maxn=max(maxn,k[i]);

cout<<maxn;
return 0;


结果:

#01: Accepted (0ms, 2692KB)
#02: Accepted (0ms, 2692KB)
#03: Accepted (0ms, 2692KB)
#04: Accepted (0ms, 2692KB)
#05: Wrong Answer (0ms, 2692KB)
#06: Wrong Answer (0ms, 2692KB)
#07: Accepted (0ms, 2692KB)
#08: Wrong Answer (0ms, 2692KB)
#09: Accepted (0ms, 2692KB)
#10: Accepted (0ms, 2692KB)

请问各位神牛鄙人代码问题所在......?

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
long k[300005],a[300005],maxn=0,n,m,l=1;//l为队列头指针
int main()

scanf("%ld%ld",&n,&m);
for(int i=1;i<=n;i++)

scanf("%ld",&a[i]);
k[i]=k[i-1]+a[i];
if(i-l>=m)k[i]-=a[l];l++;
while(a[l]<=0&&l<=i)k[i]-=a[l];l++;
if(k[i]<0)k[i]=0;l=i+1;
maxn=max(maxn,k[i]);

cout<<maxn;
return 0;

maxn=0//是不是最少得选一个的啊?如果是那样的话,初值不应该赋这个吧
参考技术A 编译了下,代码运行的很正常,结果也对的。

随机序列的最大连续子序列和的期望

【中文标题】随机序列的最大连续子序列和的期望【英文标题】:Expectation of the maximum consecutive subsequence sum of a random sequence 【发布时间】:2012-06-30 22:37:24 【问题描述】:

这是 Programming Pearls 第 2 版(第 8.7 章)中的一个问题:

考虑一个实数序列,其元素是从[-1, 1] 范围内均匀抽取的,预期的最大连续子序列总和是多少? (如果所有元素都是负数,则最大和为0。)

假设序列的长度为N,是否存在预期最大子序列和f(N)的封闭形式?我尝试做一些模拟,但没有找到任何线索。

感谢您的帮助。

【问题讨论】:

你应该把这个发到math.stackexchange.com 【参考方案1】:

执行多次模拟并保存所有结果。将它们放入 Histogram 中,您会看到某些值具有更频繁出现的属性。由于随机性,您必须执行大量测试,以便您的直方图变得更加可靠(即使这样我也不确定结果的公平性)。

【讨论】:

【参考方案2】:

这类似于一维中的Brownian motion,但步长的分布不寻常。对于大 N,它近似于 Wiener process。

(不确定这些是否很有帮助,但如果您不了解这些联系,它可能会提供更多查看的地方)。

【讨论】:

【参考方案3】:

这个问题也提交到Quora。链接是here

其中一个回复是关于模拟的:

以下是一些小案例的确切答案,由 Mathematica 提供。不幸的是,在这些之后计算变得非常慢。

In[1]:= f[n_] := Expectation[Max[0, Max[Table[Sum[x[k], k, i, j], i, n, j, i, n]]], Distributed[Table[x[i], i, n], UniformDistribution[Table[-1, 1, n]]]]

In[2]:= Table[f[n], n, 5]

Out[2]= 1/4, 1/2, 23/32, 291/320, 4141/3840

【讨论】:

以上是关于最大连续子序列问题(tyvj1305)的主要内容,如果未能解决你的问题,请参考以下文章

TYVJ1305 最大子序和

Tyvj1305最大子序和(单调队列优化dp)

TYVJ 1305 最大子序和 题解 单调队列优化DP

tyvj1305(最大子序列和————单调队列)

单调队列与DP

tyvj 1305 —— 长度不超过m的最大连续和 前缀和+单调队列