标签:style blog http color strong os
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩阵为:
9 2
-4 1
-1 8
其元素总和为15。
1 4 4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
15
解题:很难又很简单的一道题。难在于化二维平面为一维区间这种巧妙的处理方法,容易在于求最大子段和。实质就是暴力+dp
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <climits> 5 using namespace std; 6 int main() { 7 int table[110][110],i,j,ks,n,m,k,temp,ans; 8 scanf("%d",&ks); 9 while(ks--) { 10 scanf("%d %d",&n,&m); 11 memset(table,0,sizeof(table)); 12 for(i = 1; i <= n; i++) 13 for(j = 0; j < m; j++) { 14 scanf("%d",table[i]+j); 15 table[i][j] += table[i-1][j]; 16 } 17 ans = INT_MIN; 18 for(i = 0; i < n; i++) { 19 for(j = i+1; j <= n; j++) { 20 for(temp = k = 0; k < m; k++) { 21 if(temp >= 0) temp += table[j][k]-table[i][k]; 22 else temp = table[j][k]-table[i][k]; 23 if(temp > ans) ans = temp; 24 } 25 } 26 } 27 printf("%d\n",ans); 28 } 29 return 0; 30 }
标签:style blog http color strong os
原文地址:http://www.cnblogs.com/crackpotisback/p/3844728.html