讨论 / 高分悬赏
000wang1 2010-07-29 18:56:00
点我顶贴 收藏 删除
求动规原程序

最大字串和问题

#1 lizhixin@2008-07-10 03:17:00
回复 删除
什么是最大字串和问题???
#2 binarie@2008-07-10 03:22:00
回复 删除
program p145;

var

n,i,j,left,ml,mr:integer;

a:array[1..10000] of integer;

f:array[0..10000] of longint;

ma:longint;

begin

read(n);

for i:=1 to n do

read(a[i]);

f[0]:=0;ma:=0;left:=1;

for i:=1 to n do

begin

f[i]:=f[i-1]+a[i];

if(f[i]<0)then

begin

f[i]:=0;

left:=i+1;

end;

if(f[i]>ma)then

begin

ma:=f[i];

ml:=left;

mr:=i;

end;

end;

writeln(ml, ,mr);

writeln(ma);

end.

#3 from@2008-07-10 18:59:00
回复 删除
program dddd;

var

a,b,t:array[1..100000]of longint;

max:longint;

i,n,w:longint;

begin

read(n);

for i:= 1to n do

begin

read(a[i]);

end;

b[1]:=a[1];

t[1]:=1;

for i:= 2to n do

begin

if b[i-1]>0 then

begin

b[i]:=b[i-1]+a[i];

t[i]:=t[i-1];

end

else

begin

b[i]:=a[i];

t[i]:=i;

end;

end;

max:=-maxlongint;

for i:= 1to n do

begin

if b[i]>max then

begin

max:=b[i];

w:=i;

end;

end;

writeln(t[w], ,w);

write(max);

end.

#4 xiaokeke@2008-07-11 02:19:00
回复 删除
program exx;

var max,i,j,k,m,n:longint;

f:array[1..10000] of longint;

a:array[0..10000] of longint;

begin

readln(n);

m:=0;

for i:=1 to n do

begin

read(f[i]);

if f[i]>0 then m:=1;

end;

if m=0 then begin

writeln(0);

halt;

end;

max:=0;

for i:=1 to n do

begin

if max+f[i]<0 then begin

a[i]:=0; max:=0;

end

else

begin

a[i]:=max+f[i];

max:=max+f[i];

end;

end;

max:=0;

for i:=1 to n do

if a[i]>max then begin max:=a[i]; m:=i; end;

for i:= m downto 0 do

if a[i]=0 then

begin write(i+1, ,m); break; end;

writeln;

writeln(max);

end.

#5 181818181818@2008-07-11 03:39:00
回复 删除
program rqnoj145;

var n,s,max,x,i,j,maxi,maxj:longint;

begin

readln(n);

s:=0;

max:=0;

j:=1;

for i:=1 to n do

begin

read(x);

s:=s+x;

if s>max then

begin

max:=s;

maxj:=j;

maxi:=i;

end;

if s<0 then

begin

s:=0;

j:=i+1;

end;

end;

if max<0 then

begin

writeln(0);

halt;

end;

writeln(maxj, ,maxi);

writeln(max);

end.

#6 woshishui@2008-07-11 07:18:00
回复 删除
var

a,b,c:array [1..100] of longint;

n,m,i,j,k,l:longint;

begin

assign(input,a.in);reset(input);

readln(n);

l:=0;

for i:=1 to n do

begin

read(a[i]);

if a[i]>=0 then l:=1;

end;

b[1]:=a[1];

if l=0 then writeln(0)

else

for i:=2 to n do

if b[i-1]<0 then

begin

b[i]:=a[i];

c[i]:=i;

end

else

begin

b[i]:=a[i]+b[i-1];

c[i]:=c[i-1];

end;

k:=0;

l:=0;

for i:=2 to n do

if (c[i]<>i) and (b[i]>k) then

begin

k:=b[i];

l:=i;

end;

writeln(c[l], ,l);

writeln(k);

close(input);

end.

#7 332404521@2008-07-11 07:36:00
回复 删除
看到分都想要。。。

还都把程序发出来。。。

这对楼主提高有帮助吗。。。

用一个变量(初值0)和一个指针,记录首的变量,指针从头向右移动,每一动一个加到变量中,并判断是否最大(最大则记录首尾变量),如这个变量小于0,则赋值为0,首变量改为当前指针+1。时间复杂度O(n)。

这个方法可以用在“最大子矩阵”上。

如果楼主喜欢直接要程序就当我没说

#8 897357142@2010-05-29 01:17:00
回复 删除
没C的吗?

……

我的程序有一半超时……

代码:

#include"stdio.h"

#define maxn 1001

long o[maxn][maxn]={0};

long n;

int main()

{

long i,j,ans=0,x,y;

scanf("%ld",&n);

for(i=1;i<=n;i++)

scanf("%ld",&o[i][i]);

for(i=1;i<=n;i++)

for(j=i;j<=n;j++)

{

o[i][j]=o[i][j-1]+o[j][j];

if(ans<o[i][j]) {x=i;y=j;ans=o[i][j];}

}

printf("%ld %ld\n%ld",x,y,ans);

getchar();getchar();

return 0;

}

#9 863671241@2010-07-25 07:37:00
回复 删除
朴素算法

var

n,i,j,max,p,q:longint;

f,a:array[0..10000]of longint;

begin

readln(n);

for i:=1 to n do begin

read(a[i]);

f[i]:=f[i-1]+a[i];

end;

for i:=1 to n-1 do

for j:=i+1 to n do

if f[j]-f[i-1]>max then begin max:=f[j]-f[i-1];p:=i;q:=j;end;

if max=0 then write(0) else

begin

writeln(p,' ',q);

writeln(max);

end;

end.

#10 863671241@2010-07-25 07:44:00
回复 删除
稍加改良

var

n,i,j,max,p,q:longint;

f,a:array[0..10000]of longint;

begin

readln(n);

for i:=1 to n do begin

read(a[i]);

f[i]:=f[i-1]+a[i];

for j:=1 to i-1 do

if f[i]-f[j-1]>max then begin max:=f[i]-f[j-1];p:=j;q:=i;end;

end;

if max=0 then write(0) else

begin

writeln(p,' ',q);

writeln(max);

end;

end.

查看更多回复
提交回复