hdu--1081--最大子矩阵和
一般 做这题之前应该先去做下 hdu的1003----这是 一维上的 最大连续和
矩阵么 就是二维了嘛~
我一开始 走进了个错误的方向... 我去计算了第X行前Y个数的和...这是不对的
我们这里也同样用到了 前缀和的思想 但应该去计算前X个行第Y个数的和
这样 假如 有个matrix[j][y] - matrix[i-1][y]就是表示 第I行到第J行Y列上的和
如果 这个y我们用 0 ->n去遍历它 并且可以通过sum+=matrix[a][b] 来判断到第某行可以使和尽量最大
一共是需要O(n^3)的时间复杂度 去遍历整个矩阵 判断每个子矩阵的和 来求得最大的值
似乎没有更优化的了... 要是可以变成 一维的复杂度 那太好了
1 #include <iostream> 2 using namespace std; 3 4 const int size = 110; 5 int matrix[size][size]; 6 7 int main() 8 { 9 int n , i , j , k; 10 int sum , mmax , temp , num; 11 while( cin>>n ) 12 { 13 mmax = -520; 14 for( i = 0 ; i<n ; i++ ) 15 { 16 for( j = 0 ; j<n ; j++ ) 17 { 18 cin >> num; 19 matrix[i][j] = i>0 ? matrix[i-1][j] + num : num; 20 } 21 } 22 for( i = 0 ; i<n ; i++ ) 23 { 24 for( j = i ; j<n ; j++ ) 25 { 26 sum = 0; 27 for( k = 0 ; k<n ; k++ ) 28 { 29 if(i>0) 30 temp = matrix[j][k] - matrix[i-1][k]; 31 else 32 temp = matrix[j][k]; 33 sum += temp; 34 if( sum>mmax ) 35 mmax = sum; 36 if( sum<0 ) 37 sum = 0; 38 } 39 } 40 } 41 cout << mmax << endl; 42 } 43 return 0; 44 } 45
just follow your heart