http://acm.hdu.edu.cn/showproblem.php?pid=1081
把行压缩成一行 再一这行求最大子序列和
这样就把二维转化为一维
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
const int maxn = 105;
int n;
int maxs;
int map[maxn][maxn],dp[maxn]; //map存矩阵 dp为第i行之k行的数据压缩成一行的值
int getDP()
{
int sum = 0,max = 0;
for( int i = 1; i <= n; i ++ )
{
sum += dp[i];
if( sum < 0 )
{
sum = 0;
}
max = max > sum ? max:sum;
}
return max;
}
int main()
{
//freopen( "data.in","r",stdin );
int sum;
while( scanf("%d",&n) != EOF )
{
for( int i = 1; i <= n; i ++ )
{
for( int j = 1; j <= n; j ++ )
{
scanf("%d",&map[i][j]);
}
}
maxs = 0;
for( int i = 1; i <= n; i ++ ) //第i行作为压缩的第一行
{
memset( dp,0,sizeof(dp) );
for( int j = i; j <= n; j ++ ) //压缩第j行数据
{
for( int k = 1; k <= n; k ++ ) //压缩
{
dp[k] += map[j][k];
}
sum = getDP(); //求一维最大子序列和
maxs = maxs > sum ? maxs:sum;
}
}
printf("%d\n",maxs);
}
return 0;
}