最大连续子序列问题(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<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)的主要内容,如果未能解决你的问题,请参考以下文章