简单DP
按行压缩求最大和子序列
#include <iostream>
using namespace std;
int map[105][105];
int dp[105][105];
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
memset (map,0,sizeof(map));
memset (dp,0,sizeof(dp));
for (int i=1;i<=n;i++)
for (int t=1;t<=n;t++)
scanf("%d",&map[i][t]);
for (int i=1;i<=n;i++)
for (int t=1;t<=n;t++)
dp[i][t]=dp[i-1][t]+map[i][t];
int max=-200;
for (int i=1;i<=n;i++)
{
int a[105];
for (int t=i;t<=n;t++)
{
for (int k=1;k<=n;k++)
a[k]=dp[t][k]-dp[t-i][k];
int sum=0;
for (int k=1;k<=n;k++)
{
sum=sum+a[k];
if (sum>max)
max=sum;
if (sum<0)
sum=0;
}
}
}
printf("%d\n",max);
}
}