链接:http://poj.org/problem?id=1050
题意:给定n*n的矩阵,求和最大的子矩阵。
思路:我们将二维矩阵降维至一维,即将第i行到第j行的所有列压缩成一行,我们可以在线性时间求出一位的最大子段和。详见代码,复杂度O(n^3)。
AC代码:
#include<cstdio> #include<algorithm> using namespace std; int n,a[105][105],b[105]; int dp[105],ans=0xcfcfcfcf; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j){ int tmp; scanf("%d",&tmp); a[i][j]=a[i-1][j]+tmp; } for(int i=1;i<=n;++i) for(int j=i;j<=n;++j){ dp[1]=a[j][1]-a[i-1][1]; if(dp[1]>ans) ans=dp[1]; for(int k=2;k<=n;++k){ b[k]=a[j][k]-a[i-1][k]; dp[k]=max(dp[k-1]+b[k],b[k]); if(dp[k]>ans) ans=dp[k]; } } printf("%d ",ans); return 0; }