最大子矩阵问题;枚举行的组合,然后利用一维最大子段和的DP算法;
2010-04-07 22:34
531 查看
#include <iostream> using namespace std; class Martrix { private: int **martrix;//矩阵 int *b;//记录每一列的和值 int row;//行 int col;//列 int maxSum; public: Martrix(int row,int col) { martrix=new int* [row+1]; this->row=row; this->col=col; for(int i=0;i<=row;i++) { martrix[i]=new int[col+1]; } b=new int[col+1]; maxSum=0; } //输入矩阵 void input() { for(int i=1;i<=row;i++) { for(int j=1;j<=col;j++) { cin>>martrix[i][j]; } } } //一维动态规划求解最大子段和 void maxSum1() { int temp=0; for(int i=col;i>=1;i--) { if(temp>0) { temp=b[i]+temp; } else { temp=b[i]; } if(temp>maxSum) { maxSum=temp; } } } //二维动态规划求解最大子段和 void maxSum2() { for(int i=1;i<=row;i++) { for(int k=1;k<=col;k++) { b[k]=0; } for(int j=i;j<=row;j++) { for(int m=1;m<=col;m++) { b[m]+=martrix[j][m]; } maxSum1(); } } cout<<maxSum<<endl; } }; void main() { Martrix test(4,4); test.input(); test.maxSum2(); }
给定一个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。
相关文章推荐
- 0013算法笔记——【动态规划】最大子段和问题,最大子矩阵和问题,最大m子段和问题
- 【dp基础课程】矩阵取数问题+最大子段和+最长公共子序列(LCS)【51nod】
- 【算法设计】最大子段和问题
- 最大子段 ,最大子矩阵 算法
- 从最大子段和问题看算法的优化问题
- 利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES
- 【算法设计】最大子段和问题解析(对应算法第三题)
- 动态规划问题-DP 最大子段和O(n)解决方法
- dp求最大子段(一维数组,二维数组)
- 【算法】最大子段和问题
- HDU-1003 Max Sum (最大子段和问题DP)
- 从最大子段和问题看算法的优化问题
- C/C++面试之算法系列--如何利用数学思想解1/2/5组合问题
- C/C++面试之算法系列--如何利用数学思想解1/2/5组合问题
- 【算法设计】最大子段和问题解析(对应算法第三题)
- HDU1087 【DP问题之最大递增子段和问题】
- 利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题
- 最大子段和问题(这里给出三种算法)
- 三种算法求最大子段和问题——Java实现
- 关于算法—— 一维字符串数组之间组合问题的C#实现