UVa 108 - Maximum Sum

来源:互联网 发布:linux intel 显卡驱动 编辑:程序博客网 时间:2024/04/28 19:13

题目:最大子矩阵和。

分析:dp、最大字段和。二维的最大字段和。将问题转化为一维即可,即从第i列到第j列的最大字段和。所以预先对每行的第i到第j列求和,求每行的第i列到第j列的最大字段和。然后找到max[i][j]中最大的即为答案。时间复杂度O(N^3)、暴力O(N^4)。

注意:暴力枚举会TLE。

#include <stdio.h>#include <stdlib.h>#include <string.h>int dat[101][101];int sum[101][101][101];int max[101][101];int main(){int n; while ( scanf("%d",&n) != EOF ) {for ( int i = 1 ; i <= n ; ++ i ) for ( int j = 1 ; j <= n ; ++ j )scanf("%d",&dat[i][j]);for ( int i = 1 ; i <= n ; ++ i )for ( int j = 2 ; j <= n ; ++ j )dat[i][j] += dat[i][j-1];for ( int i = 1 ; i <= n ; ++ i )for ( int j = 1 ; j <= n ; ++ j )for ( int k = j ; k <= n ; ++ k )sum[i][j][k] = dat[i][k]-dat[i][j-1];int Max = -127;for ( int i = 1 ; i <= n ; ++ i )for ( int j = i ; j <= n ; ++ j ) {max[i][j] = -127;int add = 0;for ( int k = 1 ; k <= n ; ++ k ) {add += sum[k][i][j];if ( max[i][j] < add )max[i][j] = add;if ( add < 0 ) add = 0;}if ( Max < max[i][j] )Max = max[i][j];}printf("%d\n",Max);}return 0;}

原创粉丝点击