求m個不相交子段的和(複雜dp

2022-08-19 14:09:11 字數 737 閱讀 5471

題目:給定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

#includeusing

namespace

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...