题目:二维数组的最大子数组
成员:马国彬-20113000 李小超-20113003
思路:
此程序,我们通过对上一次一维数组的改进,实现了二维数组的功能。如果不考虑时间复杂度,用2个for循环能够找出一维数组的最大子数组,而通过3层for循环,就能够找出二维数组的最大子数组。在第2层for循环里,分别写两个for循环,分别寻找每一行和每一列的最大子数组。然后第3个for循环里一共有4层循环,来实现找出能够合并行列的最大子数组。开始把max设置为a[0][0],然后设置一个s,每执行一次循环,就执行s=s+a[i][j],然后如果s比max大,就把s的值赋给max,最后就能找出最大子数组。
纸上的设计:
代码:
// 二维最大子数组.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<stdio.h> int main(int argc, char* argv[]) { int a[4][5]={2,1,-3,-2,1,3,1,5,-3,-8,3,-1,-3,-2,6,2,4,6,-8,-3}; int i,j,s=0,c,d,t,max,m,n,k,x,y; for(i=0;i<4;i++) { for(j=0;j<5;j++) { s=0; for(k=i;k<4;k++) { s=s+a[k][j]; if(max<s) { max=s; c=k; d=j; m=i; n=j; } } s=0; for(t=j;t<5;t++) { s=s+a[i][t]; if(max<s) { max=s; c=i; d=t; m=i; n=j; } } s=0; for(k=i;k<4;k++) { for(t=j;t<5;t++) { s=0; for(x=i;x<=k;x++) { for(y=j;y<=t;y++) { s=s+a[x][y]; } } if(max<s) { max=s; c=x-1; d=y-1; m=i; n=j; } } } } } printf("最大子数组为:从第%d行到%d行从第%d列到%d列最大值为:%d ",m,c,n,d,max); return 0; }
实验截图: