URAL 1146 Maximum Sum(最大子矩阵的和 DP)
大意:给你一个n*n的矩阵,求最大的子矩阵的和是多少。
思路:最开始我想的是预处理矩阵,遍历子矩阵的端点,发现复杂度是O(n^4),就不知道该怎么办了。问了一下,是压缩矩阵,转换成最大字段和的问题。
压缩行或者列都是可以的。
1 int n, m, x, y, T, t; 2 int Map[1010][1010]; 3 4 int main() 5 { 6 while(~scanf("%d", &n)) 7 { 8 memset(Map, 0, sizeof(Map)); 9 for(int i = 1; i <= n; ++i) 10 { 11 for(int j = 1; j <= n; ++j) 12 { 13 scanf("%d", &t); 14 Map[i][j] = Map[i-1][j]+t; 15 } 16 } 17 int Max = -INF; 18 for(int i = 1; i <= n; ++i) 19 { 20 for(int j = i; j <= n; ++j) 21 { 22 int sum = 0; 23 for(int k = 1; k <= n; ++k) 24 { 25 sum = sum<0?0:sum; 26 sum += Map[j][k]-Map[i-1][k]; 27 Max = max(sum, Max); 28 } 29 } 30 } 31 printf("%d\n", Max); 32 } 33 34 35 return 0; 36 }