51nod1051 最大子矩阵和
2018-02-25 14:35
274 查看
1051 最大子矩阵和
基准时间限制:2 秒 空间限制:131072 KB 分值: 40
难度:4级算法题
收藏
关注
一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。
例如:3*3的矩阵:
-1 3 -1
2 -1 3
-3 1 2
和最大的子矩阵是:
3 -1
-1 3
1 2
Input
第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= M[i] <= 10^9)
Output
输出和的最大值。如果所有数都是负数,就输出0。
Input示例
3 3-1 3 -12 -1 3-3 1 2
Output示例
7
思路:枚举左右边界,然后就转化成了最大子段和,每一行相当于一个数,用数组记录前缀和。
Code:
基准时间限制:2 秒 空间限制:131072 KB 分值: 40
难度:4级算法题
收藏
关注
一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。
例如:3*3的矩阵:
-1 3 -1
2 -1 3
-3 1 2
和最大的子矩阵是:
3 -1
-1 3
1 2
Input
第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= M[i] <= 10^9)
Output
输出和的最大值。如果所有数都是负数,就输出0。
Input示例
3 3-1 3 -12 -1 3-3 1 2
Output示例
7
思路:枚举左右边界,然后就转化成了最大子段和,每一行相当于一个数,用数组记录前缀和。
Code:
#include <bits/stdc++.h> #define LL long long using namespace std; const int AX = 5e2+66; LL a[AX][AX]; LL sum[AX][AX]; LL b[AX][AX]; LL res ; int main(){ int n , m ; scanf("%d%d",&m,&n); int ok = 0 ; memset(sum,0,sizeof(sum)); for( int i = 1 ; i <= n; i ++ ){ for( int j = 1 ; j <= m ; j++ ){ scanf("%lld",&a[i][j]); if( a[i][j] ) ok = 1; } } for( int i = 1 ; i <= n ; i ++ ){ for( int j = 1 ; j <= m ; j ++ ){ sum[j][i] = sum[j-1][i] + a[i][j]; } } if( !ok ){ printf("0\n"); return 0; } res = 0; for( int i = 1 ; i <= m ; i ++ ){ for(int j = i ; j <= m ; j++ ){ LL temp = sum[j][1] - sum[i-1][1]; res = max(res,temp); for( int k = 2 ; k <= n ; k++ ){ temp = max(temp , 0LL) + (sum[j][k] - sum[i-1][k]) ; res = max(res,temp); } } } printf("%lld\n",res); return 0 ; }
相关文章推荐
- 【51nod1051】【最大子矩阵和】【动态规划】
- 51nod1051-衍生最大子段和&枚举-最大子矩阵和
- 51nod1051 最大子矩阵和
- 51nod1051_DP求最大子矩阵
- URAL 1146 Maximum Sum (最大子矩阵)
- 程序结对开发之求最大子矩阵
- HDU1559 最大子矩阵(二维树状数组)
- 最大子矩阵
- poj 1050动态规划+最大子矩阵和+二维化为一维来求最大子串和值
- 【最大子矩阵和】poj 1050 To the Max
- hdu1081 To The Max(动态规划-最大子矩阵)
- hihocoder #1502 : 最大子矩阵
- 最大子矩阵问题(动态规划的推广)
- 51nod 1051 最大子矩阵和
- 【动态规划】HDU1559最大子矩阵
- hdu 1559【最大子矩阵和DP】
- 求2维数组的子数组(子矩阵)和的最大值
- hdu 1505 /hdu 1506(最大子矩阵)
- 【OJ1768】最大子矩阵
- bzoj1084: [SCOI2005]最大子矩阵