题目很简单,求一个连续的最大子矩阵的值.
zoj上的数据非常弱。
首先爆搜是O(N^4),10^8的复杂度略高,那么我们可以处理一下其中一维的前缀和,降一阶,然后按照连续最大子序列来处理,因为可能为负数,所以基数不能取0.
上代码
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<iostream>
#include<cstring>
using namespace std;
int n;
int a[105][105];
int dp[105];
int main()
{
int t;
//freopen("input.txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&t);
a[i][j]=a[i][j-1]+t;
}//每一行的前缀和
int res=-1280000;
for(int i=0;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
memset(dp,0,sizeof(dp));
for(int k=1;k<=n;k++)
{
int t=a[k][j]-a[k][i];
if(dp[k-1]<0)
dp[k]=t;
else
dp[k]=dp[k-1]+t;
if(dp[k]>res)
res=dp[k];
}
}
printf("%d\n",res);
}