软工随堂练 找出和值最大的子矩阵 尹亚男 赵静娜
2014-03-27 17:42
225 查看
题目:从m*n矩阵中找出元素和最大的子矩阵。
分析:此题是可看做节课求和值最大子数组的一种延伸。但如果按之前的枚举法显然太过麻烦,复杂度为O(n^4)。那么有没有更好的方法呢?
我们拿出上一道题做了进一步的商讨。找了一些网上的思路得到了如下方法:
此算法的原理是,按序一个个相加,正数越加越大,每得到一个正数更新一次sum;而负数越加越小,当和值为负时,放弃前面的数,更新b,寻找新一轮的正数最大和b,当大于前面的sum时赋给sum。for循环执行一遍,将最大值在b,sum之间动态传递和更新,时间复杂度O(n),与之前的穷举法相比无疑是一种高效的算法。
那么由此延伸到二维数组中,求矩阵的最大子矩阵和,我们得到如下算法:
分析:此题是可看做节课求和值最大子数组的一种延伸。但如果按之前的枚举法显然太过麻烦,复杂度为O(n^4)。那么有没有更好的方法呢?
我们拿出上一道题做了进一步的商讨。找了一些网上的思路得到了如下方法:
#include <iostream.h> maxSubarray(int n,int a[]) { int b=0,sum=-100000; for(int i=0;i<n;i++) { if(b>0) b+=a[i]; else b=a[i]; if(b>sum) sum=b; } return sum; } int main() { int a[]={-1,3,4,-6,5,3,7,-9,10,0}; cout<<maxSubarray(10,a)<<endl; }
此算法的原理是,按序一个个相加,正数越加越大,每得到一个正数更新一次sum;而负数越加越小,当和值为负时,放弃前面的数,更新b,寻找新一轮的正数最大和b,当大于前面的sum时赋给sum。for循环执行一遍,将最大值在b,sum之间动态传递和更新,时间复杂度O(n),与之前的穷举法相比无疑是一种高效的算法。
那么由此延伸到二维数组中,求矩阵的最大子矩阵和,我们得到如下算法:
#include <iostream.h> int maxSubArray(int n,int a[]) { int b=0,sum=-10000000; for(int i=0;i<n;i++) { if(b>0) b+=a[i]; else b=a[i]; if(b>sum) sum=b; } return sum; } int maxSub(int n,int array[][10]) { int i,j,k,max=0,sum=-100000000; int b[10]; for(i=0;i<n;i++) { for(k=0;k<n;k++)//初始化b[] { b[k]=0; } for(j=i;j<n;j++)//把第i行到第j行相加,对每一次相加求出最大值 { for(k=0;k<n;k++) { b[k]+=array[j][k]; } max=maxSubArray(k,b); if(max>sum) { sum=max; } } } return sum; } void main() { int n,array[10][10]; cout<<"输入矩阵行列数"; cin>>n; cout<<"\n输入矩阵"<<endl; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>array[i][j]; } } cout<<"子矩阵元素和最大为"<<maxSub(n,array)<<endl; }
相关文章推荐
- 软工随堂练 找出和值最小的子数组 尹亚男 赵静娜
- R语言-找出向量或矩阵中的最大10个数
- 数据结构第5章例题 若矩阵Am×n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。
- 20.找出矩阵中最大的数存入数组中
- 从键盘为3*3的矩阵输入数据,找出主对角线上最大的元素,以及所在的行号
- 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
- 在只有0和1的矩阵中找出边长最大的全1矩阵
- 04_N阶楼梯上楼问题、输入一个ip地址串,判断是否合法、输入一个四行五列的矩阵,找出每列最大的两个数
- 找出矩阵中的最大矩形
- 7.找出矩阵中行最大列最小的数
- 给定一个正整数和负整数组成的N*N矩阵,编写代码找出元素总和最大的子矩阵。
- 矩阵n*m找出最大值的行列号及值
- PKU1050_求最大子矩阵和值
- 05年华中科大机试第二题(输入一个四行五列的矩阵,找出每列最大的两个数)
- 然后找出全部元素中的最大值和最小值。 用C++做1、从键盘输入3行3列矩阵的元素
- 6-2 找出矩阵中最大值所在的位置
- 20.找出N*N矩阵中列最大值并输出
- 程序员面试金典——解题总结: 9.18高难度题 18.12给定一个正整数和负整数组成的N*M矩阵,编写代码找出元素总和最大的子矩阵。
- 算法题:找出同一个序列中的最大值和最小值
- 分别用函数和带参的宏,从三个数中找出最大的数。