程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 動態規劃小結(1)最大子段和

動態規劃小結(1)最大子段和

編輯:C++入門知識

print? 1.對於一維問題,求解一個序列中的連續子段的最大和。 
狀態:一維數組dp[i]:以i結尾的最大子段和,並非前i項的最大子段和,二者有區別。 
轉移:if dp[i]>0  
        dp[i+1]=dp[i]+a[i] 
      else 
        dp[i+1]=dp[i] 
       ans=max(dp[k];k=1,2,....n), 
空間上可以用滾動數組的原理優化,空間復雜度O(1)。 
      if ans>0 dp+=a[i] 
      else dp=a[i] 
      ans=max(dp) 
<A href="http://acm.hit.edu.cn/hoj/problem/view?id=1760" target=_blank>hoj 1760 The jackpot</A> 
 
2.二維。 
預處理出每行(列)的和,sum[i][j]表示第i行第1->j列的和。 
用O(n^3)的復雜度枚舉所有的矩形,枚舉一個行,兩個列。 
對於一個矩形,行都縮為一個點,對列轉化成為一維問題處理。 
hoj 2558 maxsum 
 
 
3.三維 
和二維轉化成一維的情況完全類似。 
先預處理出底面(或其他面)的二維矩陣和。 
Sum[i][j][k]:第i層,對角端點為(1,1)和(j,k)的矩陣的元素和。 
然後用O(n^5)的復雜度枚舉所有的立方體,將底面縮為一個點,對剩下一維作為一維處理。 
hoj 2555 

 1.對於一維問題,求解一個序列中的連續子段的最大和。
狀態:一維數組dp[i]:以i結尾的最大子段和,並非前i項的最大子段和,二者有區別。
轉移:if dp[i]>0
        dp[i+1]=dp[i]+a[i]
      else
        dp[i+1]=dp[i]
       ans=max(dp[k];k=1,2,....n),
空間上可以用滾動數組的原理優化,空間復雜度O(1)。
      if ans>0 dp+=a[i]
      else dp=a[i]
      ans=max(dp)
hoj 1760 The jackpot

2.二維。
預處理出每行(列)的和,sum[i][j]表示第i行第1->j列的和。
用O(n^3)的復雜度枚舉所有的矩形,枚舉一個行,兩個列。
對於一個矩形,行都縮為一個點,對列轉化成為一維問題處理。
hoj 2558 maxsum


3.三維
和二維轉化成一維的情況完全類似。
先預處理出底面(或其他面)的二維矩陣和。
Sum[i][j][k]:第i層,對角端點為(1,1)和(j,k)的矩陣的元素和。
然後用O(n^5)的復雜度枚舉所有的立方體,將底面縮為一個點,對剩下一維作為一維處理。
hoj 2555


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved