求最大子矩阵

软件工程结对开发                                                                                         

                                                                                                                             开发者:节振华,尚矫健

开发流程:

  经过上次求一维数组的最大子数组,用优异的算法采用一次遍历就得出来,时间复杂度为O(n)。既然二维数组是有一维数组扩展出来的,那么算法也应该能扩展出来。

一维数组从左到右不返回遍历就能实现目的,猜想二维数组应该从对角线方向,细细考虑下,发现存在很多难题,对角线位置没法确认,并存在一些例子用此方法得不到正确答案。所以只能退而求其次,用穷举法。

#include<iostream.h>
static int max;
void qiongju(int juzhen[][4],int ai,int aj,int m,int n)
{  int linshi;
  for(int i=ai;i<m;i++)
  {
    for(int j=aj;j<n;j++)
    {  linshi=0;
      for(int i1=ai;i1<=i;i1++)
      {
        for(int j1=aj;j1<=j;j1++)
        {
          linshi=linshi+juzhen[i1][j1];
          
        }
      }
     // cout<<linshi<<endl;
      if(linshi>max)
      {
        max=linshi;
      }
    }
  }
}
void main()
{
    int juzhen[3][4]={{1,4,-6,5},{-6,7,-9,2},{6,4,2,-4}};
    for(int si=0;si<3;si++)                          //输出矩阵
    {
      for(int sj=0;sj<4;sj++)
      {
        cout<<juzhen[si][sj]<<" ";
      }
      cout<<endl;
    }
    max=juzhen[0][0];
    for(int i=0;i<3;i++)                       //对每一个值作为子矩阵第一个值分别求和
    {
      for(int j=0;j<4;j++)
      {
        qiongju(juzhen,i,j,3,4);
      }
    }
    cout<<"最大子矩阵和为:"<<max<<endl;
}

此算法程序应该还可以优化,在对每个子矩阵求和的时候可以借助上次求和的结果,进而简化求和。程序还未达到最优,还需努力。

posted on 2014-03-27 09:32  矫健  阅读(589)  评论(0编辑  收藏  举报

导航