地址:http://acm.bit.edu.cn/mod/programming/view.php?id=668
最大子矩阵和。其实就是做n*n次最大子段和。。
#include<iostream>
using namespace std;
int a[105][105],sum[105],dp[105];
int main()
{
int n,i,j,k,ans;
while(~scanf("%d",&n))
{
ans=-10000000;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++) //i行
{
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
for(j=0;j<n-i;j++) //到i+j行
{
for(k=0;k<n;k++) //更新sum[]为i到i+j之和 并在sum数组上做最大子段和
{
sum[k]+=a[i+j][k];
if(k==0||dp[k-1]<=0) dp[k]=sum[k];
else dp[k]=dp[k-1]+sum[k];
if(dp[k]>ans) ans=dp[k];
}
}
}
printf("%d\n",ans);
}
return 0;
}