返回一个二维整数数组中最大子数组的和(头尾相接)
1.题目。
题目:返回一个二维整数数组中最大子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
2.设计思想。
分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵。比较其中最大的子矩阵值,找出最大的。
3.代码。
#include<iostream> using namespace std; #include <ctime> #include <cstdlib> #define MAX 10000 int Max(int b[]) { int m[MAX],n=0,p=0; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { n=n+b[i+j]; m[p]=n; p++; } n=0; } int max=m[0]; for(i=0;i<p;i++) { if(m[i]>max) max=m[i]; } return max; } int main() { int k[MAX],a[4][8],h[8]; srand(time(0)); cout<<"该矩阵为:"<<endl; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { a[i][j]=rand()%100-50; a[i][j+4]=a[i][j]; cout<<a[i][j]<<" "; } cout<<endl; } for(i=0;i<4;i++) { k[i]=Max(a[i]); } int q=4; for(i=0;i<3;i++) { int t=0; for(int j=0;j<8;j++) { h[t]=a[i][j]+a[i+1][j]; t++; } k[q]=Max(h); q++; } for(i=0;i<2;i++) { int t=0; for(int j=0;j<8;j++) { h[t]=a[i][j]+a[i+1][j]+a[i+2][j]; t++; } k[q]=Max(h); q++; } int t=0; i=0; for(int j=0;j<8;j++) { h[t]=a[i][j]+a[i+1][j]+a[i+2][j]+a[i+3][j]; t++; } k[q]=Max(h); q++; cout<<endl; int max=k[0]; for(i=0;i<q;i++) { if(k[i]>max) max=k[i]; } cout<<"最大子矩阵的值为:"<<endl; cout<<max; return 0; }
4.运行结果。
5.体会。
有了思路,进行编程时就方便多了,即使有些方面不好实现,但是大家一起思考,还是能解决的。
6.照片。