以3*3的二维数组为例,可以推广到m*n的二维数组
设计思路:
1、初始化一个二位数组a[3][3];
2、定义一个与数组a空间大小相同的数组b[3][3]。第一行b[0][0]=a[0][0],如果b[0][j]的前一个值小于0,b[0][j]=a[0][j];否则b[0][j]=b[0][j-1]+a[0][j]。第一列的情况与第一行类似。数组b[3][3]的其他值b[i][j]分别于b[i][j-1]、b[i-1][j]、b[i-1][j-1]有关,分为8种情况;
3、从数组b[3][3]中找出最大值,为二维数组的最大子数组之和。
代码如下:
#include<iostream.h> int main() { int i,j; int a[3][3]={-1,-2,1,-3,4,2,3,4,-5}; int b[3][3]; int max=a[0][0]; for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout<<a[i][j]<<' '; } cout<<endl; } cout<<endl; for(i=0;i<1;i++) { b[0][0]=a[0][0]; for(j=0;j<3;j++) { if(a[0][j-1]<0) { b[0][j]=a[0][j]; } else { b[0][j]=b[0][j-1]+a[0][j]; } } } for(i=1;i<3;i++) { for(j=0;j<1;j++) { if(a[i-1][0]<0) { b[i][0]=a[i][0]; } else { b[i][0]=b[i-1][0]+a[i][0]; } } } for(i=1;i<3;i++) { for(j=1;j<3;j++) { if(b[i-1][j-1]<0) { if(b[i-1][j]>=0&&b[i][j-1]>=0) { if(b[i][j-1]>=b[i-1][j]) { b[i][j]=b[i][j-1]+a[i][j]; } else { b[i][j]=b[i-1][j]+a[i][j]; } } else if(b[i-1][j]>=0&&b[i][j-1]<=0) { b[i][j]=b[i-1][j]+a[i][j]; } else if(b[i-1][j]<=0&&b[i][j-1]>=0) { b[i][j]=b[i][j-1]+a[i][j]; } else { b[i][j]=a[i][j]; } } else { if(b[i-1][j]>=0&&b[i][j-1]>=0) { b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1]; } else if(b[i-1][j]>=0&&b[i][j-1]<=0) { b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1]; } else if(b[i-1][j]<=0&&b[i][j-1]>=0) { b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1]; } else { b[i][j]=a[i][j]; } } } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout<<b[i][j]<<" "; } cout<<endl; } cout<<endl; for(i=0;i<3;i++) { for(j=0;j<3;j++) { if(b[i][j]>max) max=b[i][j]; } } cout<<"max="<<max<<endl; return 0; }
小组成员:袁雪、王亚蕊