一、题目要求
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
要求时间复杂度为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-1]+a[i][j];
 74