题目:http://acm.hdu.edu.cn/showproblem.php?pid=1081
这道题是前文提到的Max Sum的强化版:http://blog.csdn.net/custcoder/article/details/17033323
给一个二维数组,然后用一个任意大小的矩形框去框二维数组的元素,使得矩形内元素之和最大
在DP中,就是经典的最大子矩阵问题.
其实可以将二维数组转换成一位数组的最大子序列来做
固定起始行与初始行以后,将i-j行的0-n列元素的和赋值给数组arr[n],求出arr[n]的最大子序列即可
-----------------------------------------------------------------------------------------------------------------------------------------
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int sum[101];
int matrix[101][101];
int n;
void init()
{
memset(sum,0,sizeof sum);
memset(matrix,0,sizeof matrix);
}
int maxsub(int *maxsum,int n)
{
int maxn=-99999;
int sum=0;
for(int i=0;i<n;i++)
{
if(sum<0)
sum=0;
sum+=maxsum[i];
if(maxn<sum)
maxn=sum;
}
return maxn;
}
int main()
{
int temp=0;
int maxn=-99999;
while(~scanf("%d",&n))
{
init();
temp=0;
maxn=-99999;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&matrix[i][j]);
for(int i=0;i<n;i++)
{
memset(sum,0,sizeof(sum));
for(int j=i;j<n;j++)
{
for(int k=0;k<n;k++)
{
sum[k]+=matrix[j][k];
}
temp=maxsub(sum,n);
if(temp>maxn)
maxn=temp;
}
}
printf("%d\n",maxn);
}
return 0;
}