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