您的位置:首页 > 其它

【51nod1051】【最大子矩阵和】【动态规划】

2016-11-28 14:39 281 查看

题目大意

一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。

例如:3*3的矩阵:

-1 3 -1

2 -1 3

-3 1 2

和最大的子矩阵是:

3 -1

-1 3

1 2

解题思路

枚举左右边界,可以把中间的数压成一维,在从前往后扫,如果之前的最大和大于0,那肯定连上之前的数,否则则以当前数为起点肯定更优,复杂度就是n^3.

code

#include<cstdio>
#include<algorithm>
#define LL long long
#define min(a,b) ((a<b)?a:b)
#define max(a,b) ((a>b)?a:b)
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
int const maxn=500;
int n,m,a[maxn+10][maxn+10];
LL s[maxn+10];
int main(){
scanf("%d%d",&m,&n);
fo(i,1,n)fo(j,1,m)scanf("%d",&a[i][j]);
LL ans=0,tmp;
fo(i,1,n){
fo(j,1,m)s[j]=0;
fo(j,i,n){
tmp=0;
fo(k,1,m){
s[k]+=a[j][k];
tmp=max(tmp+s[k],s[k]);
ans=max(ans,tmp);
}
}
}
printf("%lld",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: