动态规划 最大子矩阵的和
2015-06-22 20:15
169 查看
问题:最大子矩阵的和
最大子矩阵的和这个问题实际上是子串的最大和向二维空间的扩展!我们如果把每一列都看作一个数的话,实际上也是个子串的最大和问题!
不多说啦,大家看代码体会吧!
最大子矩阵的和这个问题实际上是子串的最大和向二维空间的扩展!我们如果把每一列都看作一个数的话,实际上也是个子串的最大和问题!
不多说啦,大家看代码体会吧!
package com.liheng.algorithm; /** * * @author Administrator * 利用动态规划求最大子矩阵的问题 * 重要的一个思想是把最大子矩阵的问题转化为子串的最大和 * * 基本思想是:先把列看成一个数,这样矩阵也是一个大的字符串 * 具体的看代码分析 * 算法复杂度为O(m^2n) */ public class MaxMatrix { public static void main(String []arg) { MaxMatrix mma= new MaxMatrix(); int a[][]={{9,2,-6},{-4,1,-4},{-1,8,0}}; int m=3,n=3; System.out.println(mma.MaxSum(2,2,a)); } /** * 动态规划求最大字段和 */ int MaxSumDin(int n,int a[]) { int sum=0,b=0; for(int i=0;i<=n;i++) { //如果b还为整数,就可以相加,每一次都要记录b和sum的大小,以防丢失最大字段和 if(b>0)b+=a[i]; else b=a[i]; if(b>sum) sum=b; } return sum; } int MaxSum(int m,int n,int a[][] ){ int sum=0; //定义一个一维数组b[n+1],最大子串只需要定义一个变量,因为这里要分别要记录每列的 int []b= new int[n+1]; for(int i=0;i<=m;i++) { for(int k=0;k<=n;k++){b[k]=0;}//给数组b赋初值 for(int j=i;j<=m;j++) {//每一列相加赋给b数组 for(int k=0;k<=n;k++) b[k]+=a[j][k]; int max = MaxSumDin(n,b); if(max>sum)sum=max; } } return sum; } }
相关文章推荐
- WIZwiki-W7500开发板--环境配置与初级使用
- 改造动态framework为静态framework
- 线程间流通信(管道流)
- MyEclipse Servers视窗出现“Could not create the view: An unexpected exception was thrown”错误解决办法
- hadoop之HBase集群搭建及使用
- 学习笔记《C#入门经典(第6版)》C#语言:第5章
- 项目开发设计
- 常用meta标签整理
- bzoj2819: Nim
- 在 Visual Studio 中启动、中断、单步执行、通过代码运行和停止调试
- 八数码
- 冒泡法排序
- Roman to Integer
- 数组实现栈的数据结构
- 问题解决思路(PHP CURL引起)
- 魔豆电子相框
- 《深入理解计算机系统》读后笔记二
- xml--小结②XML的基本语法
- android中xml的pull解析
- 【LeetCode 221】Maximal Square