一思路
假设f(i,j)表示以第i行开始,到第j行结束的矩阵中子矩阵的最大和
为了求f(i,j),我们对这个矩阵(第i行开始,到第j行结束的矩阵)进行处理:
把这个矩阵中的每一列数相加,最后形成一个一维数组,其长度等于原二维数组列的个数。
在该一维数组上,求解最大子数组和。
二代码
#include<iostream> using namespace std; int MAX(int s[],int n) { int i,sum=0,max=s[0]; for(i=0;i<n;i++) { if(sum>0) { sum=sum+s[i]; } else { sum=s[i]; } if(sum>max) { max=sum; } } return max; } int MIN(int s[],int n) { int i,sum=0,min=s[0]; for(i=1;i<n;i++) { if(sum<0) { sum=sum+s[i]; } else { sum=s[i]; } if(sum<min) { min=sum; } } return min; } int SUM(int s[],int n) { int i,sum=0; for(i=0;i<n;i++) { sum=sum+s[i]; } return sum; } void main() { int m,n,i,j,a[100][100]; cout<<"请输入矩阵的行数和列数:"; cin>>m>>n; cout<<"请输入矩阵元素"<<endl; for(i=0;i<m;i++) { for(j=0;j<n;j++) { cin>>a[i][j]; } } int sum,max,s[100],k=0,min,p=a[0][0]; for(i=0;i<m;i++) { for(j=0;j<n;j++) { s[j]=0; } while(k+i<m) { for(j=0;j<n;j++) { s[j]=s[j]+a[k+i][j]; } sum=SUM(s,n); min=MIN(s,n); max=MAX(s,n); if(sum-min>max) { max=sum-min; } if(max>p) { p=max; } k++; } k=0; } if(m==1&&n==1) p=a[0][0]; cout<<"子矩阵最大值为"<<p<<endl; }
三伙伴
鲁建伟
四总结
对如何查找二维整数数组最大子数组的和有了深刻的理解,对循环函数的使用也更加熟悉,但是还有许多不足,以后需要努力学习,多多练习。