动态规划练习——最大子矩阵
2017-04-20 21:03
211 查看
题目要求:
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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。
题目思路:
将矩阵的每一列压缩成一行,对压缩成的一行求最大子序列,利用循环求每行开始压缩后所得的最大子序列的值,最终得到的最大值则为最大子矩阵的值。
细节处理:
对每行开始往下压缩进行求值,求出所有的可能性。
感悟:对于二维数组的问题可以考虑转化成一位数组进行求值。
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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。
题目思路:
将矩阵的每一列压缩成一行,对压缩成的一行求最大子序列,利用循环求每行开始压缩后所得的最大子序列的值,最终得到的最大值则为最大子矩阵的值。
细节处理:
对每行开始往下压缩进行求值,求出所有的可能性。
#include<bits/stdc++.h> using namespace std; int s(int b[],int N) { int c=0,max=0,i; for(i=1;i<=N;i++) {if(c>0) c+=b[i]; else c=b[i]; if(max<c) max=c;} return max; } int main() { //freopen("d://data.in","r",stdin); int a[105][105],b[105]; int N,n=1,i,j,k,sum,max=0; cin>>N; for(i=1;i<=N;i++) { for(j=1;j<=N;j++) cin>>a[i][j];} while(n<=N) {for(j=1;j<=N;j++) b[j]=0; for(j=n;j<=N;j++) { for(k=1;k<=N;k++) b[k]+=a[j][k]; sum=s(b,N); if(max<sum) max=sum; } n++;} cout<<max<<endl; return 0; }
感悟:对于二维数组的问题可以考虑转化成一位数组进行求值。
相关文章推荐
- 动态规划练习一 02:最大子矩阵
- 动态规划练习02:最大子矩阵
- 动态规划练习一—2最大子矩阵
- 动态规划练习--02(最大子矩阵)
- 动态规划练习-2(最大子矩阵)
- 动态规划解决最大子矩阵问题
- 动态规划--最大字段和-最大子矩阵
- 动态规划最大子矩阵
- POJ 1050 To the Max(动态规划、最大子矩阵和)
- poj1050(动态规划+最大子矩阵和)
- PKU 1050 动态规划-解决最大子矩阵问题
- 【动态规划】HDU1559最大子矩阵
- 动态规划---最大子段和,最大子矩阵和,最大m子段和
- 最大子矩阵(动态规划)
- |NOIOJ|动态规划|1768:最大子矩阵
- HDU 1505(动态规划-最大子矩阵)
- 动态规划-最大子矩阵
- 动态规划——最长连续子序列和+最大子矩阵和
- HDU 2870(动态规划-最大子矩阵)
- BZOJ_1084_[SCOI2005]_最大子矩阵_(动态规划)