題目地址: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1074
這道題的dP是基于 “最大子段和” 的dp方法
例如求數(shù)組 ?1 ?2 ?-3 ?4;-5 ?6 ?-1 ?8 的最大子矩陣和,可以把兩行相加得到數(shù)組-4 ?8 ?-4 ?12,對這個數(shù)組求最大子段和為8+-4+12=16,所以矩陣對應(yīng)的最大子矩陣為2 ?-3 ?4;?6 ?-1 ?8
那么可以利用以上思想,對于m*n的矩陣A,選取他的第 i 行到第 j 行的數(shù)據(jù)組成子矩陣Aij (j-i+1行n列),Aij 對應(yīng)的最大子段和可以如下求得:對每一列的值進(jìn)行累加得到一個一維數(shù)組(1*n),對該數(shù)組求最大字段和( 其中 ?1=< i=<j<=m )。
綜上所述,A的最大子矩陣和為:max( subMatrix(Aij) ) ,其中1=< i=<j<=m ,subSegment(Aij) 表示Aij?對應(yīng)的最大子段和。
?
上代碼:
1 #include<iostream> 2 #include <cstring> 3 using namespace std; 4 5 int maxSubSegment( int *arr, int n) 6 { 7 int max=- 65535 ,sum= 0 ; 8 for ( int i= 1 ;i<=n;i++ ) 9 { 10 if (sum> 0 )sum+= arr[i]; 11 else sum= arr[i]; 12 if (max<sum)max= sum; 13 } 14 return max; 15 } 16 17 int matrix[ 101 ][ 101 ]; 18 int sum[ 101 ]; 19 int main() 20 { 21 int N; 22 cin>> N; 23 24 for ( int i= 1 ;i<=N;i++ ) 25 for ( int j= 1 ;j<=N;j++ ) 26 { 27 cin>> matrix[i][j]; 28 } 29 //////////////////////// //Dp; 30 int result=- 65535 ; 31 for ( int i= 1 ;i<=N;i++ ) 32 { 33 memset(sum, 0 , sizeof (sum)); 34 for ( int j=i;j<=N;j++ ) 35 { 36 for ( int k= 1 ;k<=N;k++ ) 37 sum[k]+= matrix[j][k]; 38 int re= maxSubSegment(sum,N); 39 if (result< re) 40 result= re; 41 } 42 } 43 cout<< result; 44 return 0 ; 45 }
?【版權(quán)聲明】轉(zhuǎn)載請注明出處? http://www.cnblogs.com/TenosDoIt/archive/2013/04/16/3025007.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
