一、题目要求
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和二、解题思路
这次就在以前的基础上进行修改,先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果。
三、程序代码
1 #include "stdafx.h" 2 #include3 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<<"初始二维数组为:"< =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 } 75 else 76 { 77 b[i][j]=b[i-1][j]+a[i][j]; 78 } 79 } 80 else if(b[i-1][j]>=0&&b[i][j-1]<=0) 81 { 82 b[i][j]=b[i-1][j]+a[i][j]; 83 } 84 else if(b[i-1][j]<=0&&b[i][j-1]>=0) 85 { 86 b[i][j]=b[i][j-1]+a[i][j]; 87 } 88 else 89 { 90 b[i][j]=a[i][j]; 91 } 92 } 93 else 94 { 95 if(b[i-1][j]>=0&&b[i][j-1]>=0) 96 { 97 b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1]; 98 } 99 else if(b[i-1][j]>=0&&b[i][j-1]<=0)100 {101 b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1];102 }103 else if(b[i-1][j]<=0&&b[i][j-1]>=0)104 {105 b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1];106 }107 else108 {109 b[i][j]=a[i][j];110 }111 }112 }113 }114 cout<<"子矩阵的和数组为:"< max)129 max=b[i][j];130 }131 }132 cout<<"最大子矩阵和为:"< <
四、结果截图
五、心得体会
这次的合作我们俩个的角色互换了,陆宇为驾驶员,我做了领航员,这次的题目,是前面两个题目的组合,求二维数组最大子矩阵的和,求环形一维数组的最大子数组的和,环形一维时,我们采用了跨越首尾和不跨越首尾两种情况,发现这种方法不适用于二维,所以采用了重构数组的方法,转化成非环形,然后求二维最大子数组的和。开始在循环条件那儿遇到了问题,后来我们两个一起解决了,这次合作让我体会到了搭档的重要性,总之,这次结对开发很成功,以后继续努力。