連接:http://poj.org/problem?id=1050spa
題意:給定n*n的矩陣,求和最大的子矩陣。code
思路:咱們將二維矩陣降維至一維,即將第i行到第j行的全部列壓縮成一行,咱們能夠在線性時間求出一位的最大子段和。詳見代碼,複雜度O(n^3)。blog
AC代碼:it
#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\n",ans); return 0; }