动态规划练习-2(最大子矩阵)
2017-04-16 16:58
183 查看
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。 比如,如下4 * 4的矩阵 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 的最大子矩阵是 9 2 -4 1 -1 8 这个子矩阵的大小是15
本题也是课上例题之一,该题其实就是求最大字段和的升级版,由于是二维的所以要压缩,而压缩的话就要将同长度行压缩,变成一维数组再求最大子段和,该题我是参考课上讲的将求最大子段和写成函数,简化主函数,细节上注意zdh函数我是将数列依次相加出现负数是证明数列有大负数,那么储存该位为上一位最大和,进行比较,接着算后面的。看下面代码解释吧。
#include<iostream> #include<string.h> using namespace std; int a[101][101],b[101]; int zdh(int b[],int n) { int sum=0,max=0; for(int i=0;i<n;i++) { sum=sum+b[i]; if(sum<0){sum=0;}//证明第i位是个大负数,到此截止 if(sum>max){max=sum;} } return max; } int main() { int n,maxy=0,p; cin>>n; for(int i=0;i<n;i++) {for(int j=0;j<n;j++) {cin>>a[i][j];}} for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { memset(b,0,sizeof(b));//细节归零 for(int g=0;g<n;g++) { for(int k=i;k<=j;k++)//求第i行到第j行压缩成一维的最大子段和 { b[g]=b[g]+a[k][g];} } p=zdh(b,n);//该子段和最大 if(p>maxy) {maxy=p;} } } cout<<maxy; }
相关文章推荐
- 动态规划练习一 02:最大子矩阵
- 动态规划练习02:最大子矩阵
- 动态规划练习一—2最大子矩阵
- 动态规划练习——最大子矩阵
- 动态规划练习--02(最大子矩阵)
- poj1050(动态规划+最大子矩阵和)
- 动态规划-最大子矩阵
- 【动态规划】HDU1559最大子矩阵
- HDU 2870(动态规划-最大子矩阵)
- 动态规划(DP)——HDU1081、PKU1050 To The Max 最大子矩阵问题
- 动态规划---最大子段和,最大子矩阵和,最大m子段和
- 最大子矩阵(动态规划)
- |NOIOJ|动态规划|1768:最大子矩阵
- HDU 1505(动态规划-最大子矩阵)
- ACM-动态规划2-最大子矩阵
- 动态规划 02 (最大子矩阵)
- BZOJ_1084_[SCOI2005]_最大子矩阵_(动态规划)
- 【POJ1050】To the Max (动态规划、最大字串和、最大子矩阵和)||NYOJ44 ||NYOJ104
- 动态规划练习--13(最大上升子序列和)
- 算法题2 动态规划之最大子序列和&最大子矩阵和