題目:給定n,m,求長度為n的數列的m個不相交子列的最大和。
視狀態為dp[i][j]為分成i組以j結尾的最大子列和,狀態轉移方程為:
dp[i][j]=max + a[j];
a: a[j]與a[j-1]相連組成第i個子列 b:a[j]不與任何子列相連,獨自形成第i個子列
i的移動需要m次迴圈,j的移動需要n次迴圈,b中max項的確認需要j-i+1次迴圈
時間複雜度可達 n^3,n最大為1000000,dp[i][j]會mle
優化: dp只與i,i-1狀態有關,可以只開一維陣列,優化空間
用premx[j-1]記錄上一次外層迴圈的max(dp[i-1][i~j-1]) 可以免去第三次迴圈 時間降為n^2
#includeusingnamespace
std;
#define maxn 1000000
const
int inf=0x3f3f3f3f
;int dp[maxn+10],a[maxn+10],premx[maxn+10
];int
main()
intmx;
dp[0]=0; premx[0]=0
;
for(int i=1;i<=m;i++)
}printf(
"%d\n
",mx);
}return0;
}
參考:
DP最大M子段和
給定n個數求這n個數劃分成互不相交的m段的最大m子段和。經典的動態規劃優化的問題。設f i,j 表示前i個數劃分成j段,且包括第i個數的最大m子段和,那麼有dp方程 f i,j max k j 1 i 1 也就是說第i個數要麼自己劃到第j段,要麼和前乙個數一起劃到第j段裡面,轉移是o n 的,總複雜...
1052 最大M子段和 (dp)
n個整數組成的序列a 1 a 2 a 3 a n 將這n個數劃分為互不相交的m個子段,並且這m個子段的和是最大的。如果m n個數中正數的個數,那麼輸出所有正數的和。例如 2 11 4 13 5 6 2,分為2段,11 4 13一段,6一段,和為26。input 第1行 2個數n和m,中間用空格分隔。...
1052 最大M子段和 DP
1052 最大m子段和 基準時間限制 2 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 n個整數組成的序列a 1 a 2 a 3 a n 將這n個數劃分為互不相交的m個子段,並且這m個子段的和是最大的。如果m n個數中正數的個數,那麼輸出所有正數的和。例如 2 11 4 13 5...