最大子矩阵和

来源:互联网 发布:qq飞车朱雀数据 编辑:程序博客网 时间:2024/05/18 17:58

(1)问题描述:给定一个m行n列的整数矩阵A,试求A的一个子矩阵,时期各元素之和为最大。

 (2)问题分析:  用二维数组a[1:m][1:n]表示给定的m行n列的整数矩阵。子数组a[i1:i2][j1:j2]表示左上角和右下角行列坐标分别为(i1,j1)和(i2,j2)的子矩阵,其各元素之和记为:

这里写图片描述
最大子矩阵问题的最优值为这里写图片描述。如果用直接枚举的方法解最大子矩阵和问题,需要O(m^2n^2)时间。注意到,这里写图片描述式中,这里写图片描述,设这里写图片描述,则这里写图片描述

容易看出,这正是一维情形的最大子段和问题。因此,借助最大子段和问题的动态规划算法MaxSum,可设计出最大子矩阵和动态规划算法如下:

//3d4-5 最大子矩阵之和问题  #include "stdafx.h"  #include <iostream>   using namespace std;   const int M=4;  const int N=3;  int MaxSum(int n,int *a);  int MaxSum2(int m,int n,int a[M][N]);  int main()  {      int a[][N] = {{4,-2,9},{-1,3,8},{-6,7,6},{0,9,-5}};      for(int i=0; i<M; i++)      {          for(int j=0; j<N; j++)          {              cout<<a[i][j]<<" ";          }          cout<<endl;      }      cout<<endl;      cout<<"数组a的最大连续子段和为:"<<MaxSum2(M,N,a)<<endl;      return 0;  }  int MaxSum2(int m,int n,int a[M][N])  {      int sum = 0;      int *b = new int[n+1];      for(int i=0; i<m; i++)//枚举行      {          for(int k=0; k<n;k++)          {              b[k]=0;          }          for(int j=i;j<m;j++)//枚举初始行i,结束行j          {              for(int k=0; k<n; k++)                   b[k] += a[j][k];//b[k]为纵向列之和              int max = MaxSum(n,b);              if(max>sum)              {                 sum = max;              }          }      }      return sum;  }  int MaxSum(int n,int *a)  {      int sum=0,b=0;      for(int i=1; i<=n; i++)      {          if(b>0)          {              b+=a[i];          }          else          {              b=a[i];          }          if(b>sum)          {              sum = b;          }      }      return sum;  }  

以上代码MaxSum2方法的执行过程可用下图表示:

这里写图片描述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大四体育挂科怎么办 大四体育没过怎么办 大二体育挂了怎么办 大学体育刚刚及格怎么办 大学体育课没选怎么办 大专挂科拿不到毕业证怎么办 大学专业课挂科怎么办 专科重修没过怎么办 大学毕业证没领怎么办 大一数学挂科怎么办 大学体育课挂了怎么办 大一考试挂科怎么办 一年级孩子考试不及格怎么办 孩子一年级数学不及格怎么办 一年级孩子考试紧张怎么办 健身动作不标准怎么办 足球赛踢平了怎么办 踢球指甲淤血了怎么办 初中一年级成绩差怎么办 着火了怎么办小班教案 小孩爱玩游戏怎么办 幼儿上学哭闹老师怎么办 孩子不喜欢上幼儿园怎么办 幼儿喜欢脱鞋怎么办 幼儿在教室乱跑怎么办 转学学校不接收怎么办 留守儿童成绩差怎么办 感冒鼻孑堵咳嗽哮喘怎么办 二年级数学报怎么办 不敢翻前滚翻怎么办啊 大学全挂了怎么办 幼儿园热了怎么办教案 幼儿园小班热了怎么办教案 高考艺术生色弱怎么办 雾眉后出现白棱怎么办 lol皮肤重复了怎么办 怕篮球砸到怎么办 前滚翻向一侧偏怎么办 大腿肌肉比较发达怎么办 学计算机老了怎么办 新生儿头尖尖的怎么办