【poj1050】 To the Max
http://poj.org/problem?id=1050 (题目链接)
题意
求二维最大子矩阵
Solution
数据好像很水,N最大才100,N^4大暴力都可以随便水过。
其实有N^3的做法。枚举矩阵上下边界,然后把中间的一大坨看作是一维的一条直线,O(n)的做最长子段和即可。当然记得要预处理出前缀和。
代码
// poj1050 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #define LL long long #define inf 2147483640 #define Pi 3.1415926535898 #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout); using namespace std; int n,a[1010][1010],sum[1010][1010]; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) scanf("%d",&a[i][j]),sum[i][j]=a[i][j]+sum[i][j-1]; int ans=-inf; for (int i=1;i<=n;i++) for (int j=i;j<=n;j++) { int s=0; for (int k=1;k<=n;k++) { s+=sum[k][j]-sum[k][i-1]; if (s<0) s=0; else ans=max(ans,s); } } printf("%d",ans); return 0; }
This passage is made by MashiroSky.