您的位置:首页 > 其它

最大子矩阵(最大子序列变形)

2017-04-03 13:34 169 查看
问题描述

  给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大。

  其中,A的子矩阵指在A中行和列均连续的一块。

输入格式

  输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数。

  接下来n行,每行m个整数,表示矩阵A。

输出格式

  输出一行,包含一个整数,表示A中最大的子矩阵中的元素和。

样例输入

3 3

-1 -4 3

3 4 -1

-5 -2 8

样例输出

10

样例说明

  取最后一列,和为10。

数据规模和约定

  对于50%的数据,1<=n, m<=50;
  对于100%的数据,1<=n, m<=500,A中每个元素的绝对值不超过5000。

最大子序列问题的变形。

用b[j]表示第j列的第r到第i行的元素值,r=1是初始行,然后用求最大子序列的方法枚举求出最大子阵。

将二维转化成一维的问题。

#include <bits/stdc++.h>
const int N=505;
const int INF=999999999;
using namespace std;

int main()
{
int n,m;
int a

,dp
,b
;
int ans=-INF;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
}
for(int r=1;r<=n;r++)
{
memset(b,0,sizeof(b));
for(int i=r;i<=n;i++)
{
for(int j=1;j<=m;j++) b[j]+=a[i][j];

int k=-INF;
for(int j=1;j<=m;j++)
{
k=max(0,k)+b[j];
ans=max(ans,k);
}
}

}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: