一,最大子矩阵问题:
       给定一个n*n(0<n<=100)的矩阵,请找到此矩阵的一个子矩阵,并且此子矩阵的各个元素的和最大,输出这个最大的值。
Example:
 0 -2 -7  0 
 9  2 -6  2 
-4  1 -4  1 
-1  8  0 -2 
其中左上角的子矩阵:
 9 2 
-4 1 
-1 8 
此子矩阵的值为9+2+(-4)+1+(-1)+8=15。

二,分析

子矩阵是在矩阵选取部份行、列所组成的新矩阵。

例如

它亦可用A(3;2)表示,显示除掉第3行和第2列的余下的矩阵。这两种方法比较常用,但还是没有标准的方法表示子矩阵。

以上为维基百科上给出的定义,感觉跟此题的定义不是一回事呢?

我们首先想到的方法就是穷举一个矩阵的所有子矩阵,然而一个n*n的矩阵的子矩阵的个数当n比较大时时一个很大的数字 O(n^2*n^2),显然此方法不可行。怎么使得问题的复杂度降低呢?对了,相信大家应该知道了,用动态规划。对于此题,怎么使用动态规划呢?

请先参考-->最大子段和问题
        这个问题与最大子段有什么联系呢?

假设最大子矩阵的结果为从第r行到k行、从第i列到j列的子矩阵,如下所示(ari表示a[r][i],假设数组下标从1开始):

| a11 …… a1i ……a1j ……a1n |
  | a21 …… a2i ……a2j ……a2n |
  |  .     .     .    .    .     .    .          |
  |  .     .     .    .    .     .    .          |
  | ar1 …… ari ……arj ……arn    |
  |  .     .     .    .    .     .    .          |
  |  .     .     .    .    .     .    .          |
  | ak1 …… aki ……akj ……akn  |
  |  .     .     .    .    .     .    .          |
  | an1 …… ani ……anj ……ann |

那么我们将从第r行到第k行的每一行中相同列的加起来,可以得到一个一维数组如下:
 (ar1+……+ak1, ar2+……+ak2, ……,arn+……+akn)
 由此我们可以看出最后所求的就是此一维数组的最大子段和问题,到此我们已经将问题转化为上面的已经解决了的问题了。

三,源码

C++:

#include <iostream> using namespace std; int maxSubArray(int a[],int n) { int b=0,sum=a[0]; 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 maxSubMatrix(int array[][3],int n) { int i,j,k,max=0,sum=-100000000; int b[3]; 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(b,k); if(max>sum) { sum=max; } } } return sum; } int main() { int n=3; int array[3][3]={{1,2,3},{-1,-2,-3},{4,5,6}}; cout<<"MaxSum: "<<maxSubMatrix(array,n)<<endl; }

java:

import java.util.Scanner; public class PKU_1050 { private 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; } private int maxSubMatrix(int n,int[][] array) { int i,j,k,max=0,sum=-100000000; int b[]=new int[101]; 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; } public static void main(String args[]) { PKU_1050 p=new PKU_1050(); Scanner cin=new Scanner(System.in); int n=0; int[][] array=new int[101][101]; while(cin.hasNext()) { n=cin.nextInt(); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { array[i][j]=cin.nextInt(); } } System.out.println(p.maxSubMatrix(n,array)); } } }

转载于:https://www.cnblogs.com/JPAORM/archive/2012/04/23/2510005.html

【算法设计】最大子矩阵问题相关推荐

  1. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(1)签到题15869

    2021"MINIEYE杯"中国大学生算法设计超级联赛(1) Start Time : 2021-07-20 12:10:00 End Time : 2021-07-20 17:1 ...

  2. 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt

    <王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...

  3. 计算机算法设计与分析(第4版) 王晓东 著 2012.2 笔记(这本书还不错,偏实用、有难度)

    计算机算法设计与分析(第4版) 目录 1 算法概述 2 递归与分治策略 3 动态规划 4 贪心算法 5 回溯法 6 分支限界法 7 随机化算法 8 线性规划与网络流 算法概述 复杂性分析 NP-完全性 ...

  4. 算法设计与分析复习笔记(上)

    简介:本文是博主在复习算法设计与分析的笔记,参考了北大算法设计与分析以及王晓东编著的<计算机算法设计与分析>第四版相关内容,如有错误,欢迎指正. 文章目录 设计技术 分治 动态规划 设计技 ...

  5. 算法设计与分析——分治法

    主要思想 (其实有这个思想也想不出来): 1.划分:整个问题划分成多个子问题 2.求解:求解各子问题的解 3.合并:合并子问题的解 (手说:"我会了",脑子:"不会&qu ...

  6. 大白书 1.3节 高效算法设计举例

    大白书 1.3节 高效算法设计举例 例题 17 UVA 11462 简单题,注意那个数值的范围是100以内就可以了. #include <cstdio> #include <cstr ...

  7. 算法设计与分析第5章 回溯法(二)【回溯法应用】

    第5章 回溯法 5.2 应用范例 1.0-1背包问题 有n件物品和一个容量为c的背包.第i件物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和 ...

  8. 利用c语言检测气体浓度,一氧化碳气体检测仪的算法设计

    0 引言 一氧化碳(CO)是最为常见的一种有毒有害的可燃可爆性气体,它给工业安全生产带来了巨大的危害.因此研制一种能够实时准确地测量一氧化碳气体浓度的气体检测仪是非常必要的.目前应用于一氧化碳气体的检 ...

  9. 用栈、回溯算法设计迷宫程序

    目录 1.走迷宫与回溯算法 2.迷宫设计栈扮演的角色 3.Python实现走迷宫 栈的应用有许多,本篇博文着重将栈与回溯(Backtracking)算法结合,设计走迷宫程序.其实回溯算法也是人工智能的 ...

  10. 算法设计与分析之循环与递归

    前言: 循环与递归可以说是算法设计中最基本但却也是最重要的工具方法.循环和递归对于学习过高级程序设计语言的人来说都并不陌生,但还是有必要仔细的探究一下循环和递归之间的相似和区别.循环与递归最大的相似之 ...

最新文章

  1. android media player setlooping,Android Mediaplayer-一次播放铃声
  2. 我用AI分析了《赛博朋克 2077》的评价,发现真爱粉都是来吸猫的
  3. MonoDevelop 1.0 和 Mono 1.9(2.0 beta)发布了
  4. python编程题-python编程练习题目
  5. 数平精准推荐 | OCR技术之数据篇
  6. C#空接合操作符——??
  7. python编程可以自学么-怎么能学习好python编程?有自学的方法吗?
  8. 【贪心 和 DP + 卖股票】LeetCode 122. Best Time to Buy and Sell Stock II
  9. Android12前台服务问题
  10. 1 0.99999的悖论_物理学四大神兽:你能追上乌龟吗?无穷大到底是多大?(1)...
  11. 计算机编程在哪里学,高中毕业想学计算机编程,不知道从哪开始学起。
  12. JAVA 计算宝箱概率问题
  13. 站在山顶上看golang的前世今生与未来展望
  14. thinkphp5.1 + 汉字转拼音 + 获取拼音首字母
  15. linux内核内存屏障,从硬件引申出内存屏障,带你深入了解Linux内核RCU
  16. 解密联物电子科技冠军电感(恩智浦智能车竞赛之电磁信号采集)
  17. 计算机毕业设计Java保险公司风险测评管理系统(源码+系统+mysql数据库+lw文档)
  18. android studio记账,Android Studio--家庭记账本(五)
  19. 音乐解锁工具v1.10.3,音乐格式转换,ncm转mp3,kgm转mp3,kgma转mp3,mgg转mp3,mflac转mp3,qmc转mp3,xm转mp3,kwm转mp3
  20. 修改deepin20.4窗口特效魔灯的动画时长

热门文章

  1. 后台弹框。刷新不提示确认VB或.NET
  2. Android App性能优化十技巧
  3. 软件设计师25-操作系统
  4. LAMP/LNMP环境下:phpinfo php连接mysql php执行mysql查询 测试代码及响应
  5. 使用shell脚本 控制 python挂掉后自动重启
  6. java使用freemaker自定义路径导出Word关键点讲解版
  7. JQuery动态循环绑定事件
  8. 东北大学c语言及程序设计题库,东北大学c语言编程试题及其答案
  9. 颜色叠加 java_可绘制Android上的颜色叠加
  10. 输入6个学生的5门成绩c语言数组,C语言数组指针的小例子.pdf