二维数组的最大子数组

题目:二维数组的最大子数组

成员:马国彬-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\n",m,c,n,d,max);
    return 0;
}

实验截图:

posted @ 2014-03-19 22:12  Magic彬~  阅读(474)  评论(1编辑  收藏  举报