小组成员(李夏蕾 杨世超)
这次的题目是接着上次的一维数组进行的进一步的引申,虽然考虑了很多的方法,但还是觉得穷举法是最保险的一种,下面是我们的思路:
我们采用的是自己输入行数和列数,然后输入数据进行测试。同时申请了两个数组用来存放子集的长度和宽度,好用来输出。
主要的就是for循环了,首先是最外层的,先从i=0开始,当j=0时,先将包含a[0][0]的所有子集都遍历一遍,并求出最大值,记录下来,然后是a[0][1],如此循环下去。在循环中利用的是一维数组求最大子集的方法,不同的是在其中加入了for(x=0;x<row;x++),让其可以把下一行也遍历,因为是矩形数组,所以要考虑行和列。
而在遍历过程中,通过比较max的值,让其在每一个数据中找出一个最大的,同时记录下最大值的行长度和列长度以便输出。对于子数组的输出也和一维数组相同,只是改为二维的而已。
下面是循环模块的代码:
for(i=0;i<row;i++) { for(j=0;j<column;j++) { max=a[i][j]; for(m=1;m<=column-j;m++) { sum=0; length=1; line=i; for(x=i;x<row;x++) { for(k=j;k<j+m;k++) { sum=sum+a[x][k]; } if(max<=sum) { max=sum; length=m; line=x; b[i][j]=max; c[i][j]=length; d[i][j]=line; } } } } }
程序源代码如下:
#include<iostream> using namespace std; #define N 100 int main() { int row,column; int sum,max; int i,k,j,t,m,x,n,s; int a[N][N],b[N][N],c[N][N],d[N][N]; int length,line; cout<<"请输入数组的行数:"<<endl; cin>>row; cout<<"请输入数组的列数:"<<endl; cin>>column; cout<<"请输入数组元素:"<<endl; for(i=0;i<row;i++) { for(j=0;j<column;j++) { cin>>a[i][j]; } } for(i=0;i<row;i++) { for(j=0;j<column;j++) { max=a[i][j]; for(m=1;m<=column-j;m++) { sum=0; length=1; line=i; for(x=i;x<row;x++) { for(k=j;k<j+m;k++) { sum=sum+a[x][k]; } if(max<=sum) { max=sum; length=m; line=x; b[i][j]=max; c[i][j]=length; d[i][j]=line; } } } } } max=b[0][0]; t=0; n=0; for(i=0;i<row;i++) { for(j=0;j<column;j++) { if(max<b[i][j]) { max=b[i][j]; t=i; n=j; } } } cout<<"最大子数组和是:"; cout<<max<<endl; cout<<"子序列为"<<endl; for(i=t;i<=d[t][n];i++) { for(j=n;j<n+c[t][n];j++) { cout<<a[i][j]<<'\t'; } cout<<endl; } return 0; }
运行结果如下: