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.
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.
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.
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.
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.
还都把程序发出来。。。
这对楼主提高有帮助吗。。。
用一个变量(初值0)和一个指针,记录首的变量,指针从头向右移动,每一动一个加到变量中,并判断是否最大(最大则记录首尾变量),如这个变量小于0,则赋值为0,首变量改为当前指针+1。时间复杂度O(n)。
这个方法可以用在“最大子矩阵”上。
如果楼主喜欢直接要程序就当我没说
……
我的程序有一半超时……
代码:
#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;
}
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.
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.