一、题目要求
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和
二、解题思路
先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果。
三、程序代码
2 #include<iostream.h>
3 int main(int argc, char* argv[]) 4 { 5 int i,j; 6 int a[3][5]={{1,-2,3},{1,-3,2},{4,-4,5}}; 7 int b[3][5]; 8 for(i=0;i<3;i++) 9 { 10 for(j=0;j<2;j++) 11 a[i][j+3]=a[i][j]; 12 } 13 int max=a[0][0]; 14 cout<<"初始二维数组为:"<<endl; 15 for(i=0;i<3;i++) 16 { 17 for(j=0;j<3;j++) 18 { 19 cout<<a[i][j]<<' '; 20 } 21 cout<<endl; 22 } 23 cout<<"重构后环形数组为:"<<endl; 24 for(i=0;i<3;i++) 25 { 26 for(j=0;j<5;j++) 27 { 28 cout<<a[i][j]<<' '; 29 } 30 cout<<endl; 31 } 32 33 34 for(i=0;i<1;i++) 35 { 36 b[0][0]=a[0][0]; 37 for(j=0;j<5;j++) 38 { 39 if(a[0][j-1]<0) 40 { 41 b[0][j]=a[0][j]; 42 } 43 else 44 { 45 b[0][j]=b[0][j-1]+a[0][j]; 46 } 47 } 48 } 49 for(i=1;i<3;i++) 50 { 51 for(j=0;j<1;j++) 52 { 53 if(a[i-1][0]<0) 54 { 55 b[i][0]=a[i][0]; 56 } 57 else 58 { 59 b[i][0]=b[i-1][0]+a[i][0]; 60 } 61 } 62 } 63 for(i=1;i<3;i++) 64 { 65 for(j=1;j<5;j++) 66 { 67 if(b[i-1][j-1]<0) 68 { 69 if(b[i-1][j]>=0&&b[i][j-1]>=0) 70 { 71 if(b[i][j-1]>=b[i-1][j]) 72 { 73 b[i][j]=b[i][j-