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