一个暴力搜索。先定1行为界限,不断地 用接下来的行减去第一行,就可以反馈一个竖列的和,在加上旁边的相同长度的竖列,如果大于0,就先记住一下,再比较先前的sum大,还是加了之后大,用一个maxn存起来,sum只要不小于0就一直存着每行竖列的相加,当小于0时就重置为0,意思就是前面那段构不成最长竖列的和了,此时就舍去。之后竖列从1到n,无限得变长,记住每个sum,的最大值。一个dp的爆搜,但是不用dp还是会超时。
#include<iostream>
#include<algorithm>
using namespace std;
int a[500][500] = { 0 };
int dp[500][500];
int main()
{
int n;
cin >> n;
int sum, temp, maxn=0;
for (int i = 1; i <=n; i++)
{
dp[i][0] = 0;
dp[0][i] = 0;
}
for (int i = 1; i <=n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> a[i][j];
}
}
for (int i = 1; i <=n; i++)
{
for (int j = 1; j <= n; j++)
{
dp[i][j] = dp[i - 1][j] + a[i][j];
}
}
for (int i = 1; i <=n; i++)
{
for (int j = i; j <=n; j++)
{
sum = 0;
for (int k = 1; k <=n; k++)
{
temp = dp[j][k] - dp[i - 1][k];
sum = sum + temp;
if (sum<0)
{
sum = 0;
}
maxn = max(maxn, sum);
}
}
}
cout << maxn << endl;
}