步骤
1. 枚举两行(i , j)
2.将两行压缩,转换为最大子段和
小技巧
#include <iostream>
#include <memory.h>
int n;
using namespace std;
int a[105][105];
int sum[105][105];
int dp[105][105][105];
int main()
{
cin >> n;
for( int i = 1; i <= n; i++ )
for( int j = 1; j <= n; j++ )
{
cin >> a[i][j];
for( int k = 1; k <= n; k++)
dp[i][j][k] = -(1<<30);
}
memset(sum, 0, sizeof(a));
for( int i = 1; i <= n; i++ )
for( int j = 1; j <= n; j++ )
{
sum[i][j] = sum[i-1][j] + a[i][j];
}
for( int i = 1; i <= n; i++)
for( int j = i; j <= n; j++)
{
for(int k = 1; k <= n; k++)
dp[i][j][k] = max(dp[i][j][k-1] + sum[j][k] - sum[i][k], sum[j][k] - sum[i][k] );
}
int Max = -(1<<30);
for( int i = 1; i <= n; i++)
for( int j = i; j <= n; j++)
for(int k = 1; k <= n; k++)
Max = max(Max, dp[i][j][k]);
cout << Max << endl;
return 0;
}