标签:
1 #include "cstdio" 2 #include "cstring" 3 #include "algorithm" 4 #include "cmath" 5 using namespace std ; 6 7 int gmax( int a , int b)//求最大值 8 { 9 return a > b ? a : b ; 10 } 11 12 int best[110], temp[110]; 13 14 int tmp[110][110], pr[110][110]; 15 16 void Init ( int n ) 17 { 18 for( int i = 1 ; i <= n ; ++i )pr[1][i] = tmp[1][i] ;//pr[]数组用前缀和思想 19 for(int i = 2 ; i <= n ; ++i ) 20 for (int j = 1 ; j <= n ; ++j ) 21 pr[i][j] = pr[i - 1][j] + tmp[i][j] ;//计算前缀和 22 return ; 23 } 24 25 int solve ( int *a , int N) 26 { 27 28 memset ( best , 0 , sizeof(best));//best数组表示以i为结尾的最大子序列和 29 int ans = -2147483647 ; 30 for ( int i = 1 ; i <= N ; ++i) 31 { 32 if ( best[i - 1] + a[i] > a[i]) 33 { 34 best[i] = best[i - 1] + a[i] ;//DP方程 35 } 36 else 37 { 38 best[i] = a[i] ;//DP方程 39 } 40 } 41 for ( int i = 1 ; i <= N ; ++i )ans = gmax( ans , best[i]);//求出best数组中的最大值,即最大子序列和 42 return ans ; 43 } 44 45 int main ( ) 46 { 47 int ans = -2147483647 , n; 48 scanf("%d", &n); 49 for(int i = 1 ; i <= n ; ++i ) 50 { 51 for (int j = 1 ; j <= n ; ++j ) 52 { 53 scanf("%d", &tmp[i][j]); 54 } 55 } 56 Init ( n );//预处理 57 for ( int i = 1 ; i <= n ; ++i) 58 { 59 for ( int j = i ; j <= n ; ++j ) 60 { 61 memset( temp , 0 , sizeof(temp)); 62 for ( int k = 1 ; k <= n ; ++k ) 63 { 64 temp[k] = pr[j][k] - pr[i - 1][k];//temp数组是降维后的数组 65 } 66 ans = gmax(solve ( temp , n) , ans );//求出最大值 67 } 68 } 69 printf("%d\n", ans); 70 return 0 ; 71 }
标签:
原文地址:http://www.cnblogs.com/shadowland/p/5870382.html