zoj1074 To the Max

题目很简单,求一个连续的最大子矩阵的值.

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);
}
posted @ 2015-10-13 22:01  acliang  阅读(216)  评论(0编辑  收藏  举报