51nod 1051 最大子矩阵和 (dp_good)

来源:互联网 发布:产品经理和数据分析 编辑:程序博客网 时间:2024/04/17 01:25


一个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


思路:

a11  a12  a13

a21  a22  a23

a31  a32  a33

  如图,先求第一行最大子段和,再求第一行跟第二行合起来的最大子段和,如a21+a11, a22+a12, a23+a13  的最大子段和,再求第一到第三合起来的最大子段和,如a11+a21+a31,  a12+a22+a32, a13+a23+a33的最大子段和…..以此类推,直到求出整个矩阵的合起来的最大子段和,求出他们之中最大的那个和就是解.


#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;ll a[555][555],c[555],dp[555];ll solve(int n){ll ans=0;memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++) {dp[i]=max(dp[i-1]+c[i],(ll) 0);ans=max(dp[i],ans);}return ans;} int main(){int n,m,i,j,k;ll ans=0;cin>>m>>n;for(i=1;i<=n;i++) {for(j=1;j<=m;j++)cin>>a[i][j];}for(i=1;i<=n;i++) {memset(c,0,sizeof(c));for(j=i;j<=n;j++) {for(k=1;k<=m;k++) {c[k]=c[k]+a[j][k];}ans=max(ans,solve(m));}}cout<<ans<<endl;}







0 0
原创粉丝点击