最大子矩阵和
题目链接: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; }