进阶工程代码3.21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include<iostream> #include<vector> using namespace std; int MaxSubArraySum_1( const vector< int > &arr){ int n=arr.size(); if (n== 0 ) return 0 ; int sum=arr[ 0 ]; int max=arr[ 0 ]; for ( int i= 1 ;i<n;i++){ if (sum>= 0 ) sum+=arr[i]; else sum=arr[i]; if (sum>max) max=sum; } return max; } int MaxSubArraySum_2( const vector< int > &arr){ int n=arr.size(); if (n== 0 ) return 0 ; vector< int > maxSub(n); maxSub[ 0 ]=arr[ 0 ]; int max=arr[ 0 ]; for ( int i= 1 ;i<n;i++){ maxSub[i]=(maxSub[i- 1 ]> 0 )?(maxSub[i- 1 ]+arr[i]):arr[i]; if (max<maxSub[i]) max=maxSub[i]; } return max; } int MaxSubMatrixSum( const vector<vector< int > > &arr){ int m=arr.size(); int n=arr[ 0 ].size(); vector<vector< int > > total(m,vector< int >(n, 0 )); for ( int i= 0 ;i<n;i++) total[ 0 ][i]=arr[ 0 ][i]; for ( int i= 1 ;i<m;i++){ for ( int j= 0 ;j<n;j++){ total[i][j]=total[i- 1 ][j]+arr[i][j]; } } int max=- 1000 ; vector< int > result(n); for ( int i= 0 ;i<m;i++){ for ( int j=i;j<m;j++){ for ( int f= 0 ;f<n;f++){ if (i== 0 ) result[f]=total[j][f]; else result[f]=total[j][f]-total[i- 1 ][f]; } int maximal=MaxSubArraySum_2(result); if (maximal>max) max=maximal; } } return max; } int main(){ vector<vector< int > > mat={{ 0 ,- 2 ,- 7 , 0 },{ 9 , 2 ,- 6 , 2 },{- 4 , 1 ,- 4 , 1 },{- 1 , 8 , 0 ,- 2 }}; cout<< MaxSubMatrixSum(mat); return 0 ; } |