http://acm.hdu.edu.cn/showproblem.php?pid=1081
这道题目是一道比较经典的动态规划问题,做了这道题目才知道原来一切都是万变不离其宗是啥子意思!这是一道求二维矩阵中最大子矩阵和的问题,和一维求最大字段和有一
定的联系!以前看过这道题,但是没有想出来怎么做,今天刷题刷到这里,又看了看别人的解析,才马马虎虎做出来!
求解过程中,固定行,然后将任意两行之间的所有列值加起来,然后求这个序列中最大子序列和,就是所求的最大子矩阵和
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=105;
int n;
int dp[maxn][maxn];
int b[maxn];
//一维的求最大字段和问题
int maxsub(int b[],int n)
{
int sum=0,max=0;
for(int i=0;i<n;i++)
{
if(sum>0) sum+=b[i];
else sum=b[i];
if(sum>max) max=sum;
}
return max;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int max=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&dp[i][j]);
//从一维的基础上延伸出来
//将两行之间的所有列值加起来,然后求这个序列中最大字段和
for(int i=0;i<n;i++)
{
memset(b,0,sizeof(b));
for(int j=i;j<n;j++)
{
for(int k=0;k<n;k++)
b[k]+=dp[j][k];
int ans=maxsub(b,n);
if(ans>max) max=ans;
}
}
printf("%d\n",max);
}
return 0;
}