k为定值
int findMax(int a[],int n,int k){
if(n<k||n<0||k<0){
error(0);
}
int sum=a[0];
for(int i=1;i<k;i++){
sum+=a[i];
}
int max=sum;
for(int i=k;i<n;i++){
sum=sum-a[i-k]+a[i];
if(sum>max){
max=sum;
}
}
return max;
}
k不是定值
一维
int findMax(int a[],int n){
if(n<0){
error(0);
}
int max,sum;
max=sum=a[0];
for(int i=1;i<n;i++){
sum=sum>0?sum+a[i]:a[i];//前面的和不大于0,加上去会变小,不如重新开始
if(sum>max){
max=sum;
}
}
return max;
}
二维
暴力
#include<stdio.h>
#define MAX(x,y) x>y?x:y
int I,J;
int a[520][520];
int findMax(){
int s[I+1][J+1];
for(int i=0;i<=I;i++){
s[i][0]=0;
}
for(int j=0;j<=J;j++){
s[0][j]=0;
}
for(int i=1;i<=I;i++){
for(int j=1;j<=J;j++){
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i-1][j-1];
}
}
int max=INT_MIN;
for(int i=1;i<=I;i++){
for(int i1=i;i1<=I;i1++){
for(int j=1;j<=J;j++){
for(int j1=j;j1<=J;j1++){
max=MAX(max,s[i1][j1]-s[i-1][j1]-s[i1][j-1]+s[i-1][j-1]);
}
}
}
}
return max;
}
int main(){
scanf("%d%d",&I,&J);
for(int i=0;i<I;i++){
for(int j=0;j<J;j++){
scanf("%d",&a[i][j]);
}
}
printf("%d",findMax());
}
改进
#include<stdio.h>
int I,J;
int a[520][520];
int findMax(){
int s[I+1][J+1];
for(int i=0;i<=I;i++){
s[i][0]=0;
}
for(int j=0;j<=J;j++){
s[0][j]=0;
}
for(int i=1;i<=I;i++){
for(int j=1;j<=J;j++){
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i-1][j-1];
}
}
int max=a[0][0];
for(int i=1;i<=I;i++){
for(int i1=i;i1<=I;i1++){
int sum=s[i1][1]-s[i-1][1];
for(int j=2;j<=J;j++){
sum=sum>0?sum+s[i1][j]-s[i-1][j]-s[i1][j-1]+s[i-1][j-1]:s[i1][j]-s[i-1][j]-s[i1][j-1]+s[i-1][j-1];
if(sum>max){
max=sum;
}
}
}
}
return max;
}
int main(){
scanf("%d%d",&I,&J);
for(int i=0;i<I;i++){
for(int j=0;j<J;j++){
scanf("%d",&a[i][j]);
}
}
printf("%d",findMax());
}