最大子矩阵和 51Nod - 1051

最大子矩阵和

题目链接:51Nod - 1051
题意:给出一个矩阵, 每个单位矩阵有个数, 求数值和最大的矩阵;
看起来似乎很棘手, 其实并不难, 思路开阔开阔;
只要够成矩阵那么一定是单行或多行的矩阵, 那么我们将一列的数值加起来不久转化成了一维数组求最大子段和了么;
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=600;
int n, m;
long long a[maxn][maxn], dp[maxn], sum[maxn];
int main(){
	while(~scanf("%d%d", &m, &n)){
		for(int i=1; i<=n; i++){
			for(int j=1; j<=m; j++){
				scanf("%lld", &a[i][j]);
			}
		}
		dp[0]=0LL;
		long long ans=0LL;
		for(int i=1; i<=n; i++){
			memset(sum, 0, sizeof(sum));
			for(int j=i; j<=n; j++){
				for(int k=1; k<=m; k++){
					sum[k]=sum[k]+a[j][k];
				}
				for(int k=1; k<=m; k++){
					dp[k]=max(dp[k-1]+sum[k], 0LL);
					ans=max(ans, dp[k]);
				}
			}
		}
		printf("%lld\n", ans);
	}
	return 0;
} 


猜你喜欢

转载自blog.csdn.net/sirius_han/article/details/80392456
今日推荐