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); }