hdu 1081 To The Max (动态规划)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1081

解题报告:求最大的矩阵和的问题,可以转化为最大连续子序列和的模型,只不过这个是一个二维的问题。如何转化是关键:我们可以把每一项变成前面多项的和,通过相减计算每个子矩阵。在求解的时候竖着求解,这样子问题就转换为1维求解最大连续子序列和的问题。

给一组参考数据:
4
-3 -7 -1 -2
-3 -4 -2 -5
-3 -5 -2 -3
-4  6 -3 -2

参考代码:

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

#define MAX (100 + 5)

int mp[MAX][MAX],sum[MAX][MAX];
int temp[MAX][MAX];
 
int main()
{
	int n,ans,cnt;
	while(scanf("%d",&n)!=EOF)
	{
		int  mini = -0x7ffffff;
		memset(mp,0,sizeof(mp));
		memset(sum,0,sizeof(sum));
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
			{
				scanf("%d",&mp[i][j]);
				if(mp[i][j] > mini)
					mini = mp[i][j];
			}
		if(mini<0)
		{
			printf("%d\n",mini);
			continue;
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)	
				sum[i][j]=sum[i][j-1]+mp[i][j];
		}
		ans=0;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				for(int k=0;k<i;k++)
				{ 
					temp[j][k+1]=sum[j][i]-sum[j][k];
				}
			}
			for(int k=1;k<=i;k++)
			{
				cnt=0;
				for(int j=1;j<=n;j++)
				{
					cnt+=temp[j][k];
					if(ans<cnt)	ans=cnt;
					if(cnt<0)	cnt=0;
				}
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

猜你喜欢

转载自ren-hui.iteye.com/blog/1922995