• 求最大子矩阵


    软件工程结对开发                                                                                         

                                                                                                                                 开发者:节振华,尚矫健

    开发流程:

      经过上次求一维数组的最大子数组,用优异的算法采用一次遍历就得出来,时间复杂度为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;
    }

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

  • 相关阅读:
    字符串拆分成泛型列表
    第一次写博客
    获取最长的增长列表
    oracle 一些小资料
    XML 序列化出错
    Redis学习(一)
    SQL和NoSQL的区别
    SpringBoot中文乱码解决方法
    从visual studio 2012生成预处理代码&汇编码
    近期流水账
  • 原文地址:https://www.cnblogs.com/shangjiaojian/p/3627562.html
Copyright © 2020-2023  润新知