次のように内容は次のとおりです。
整数配列を考えると
A
、あなたは最大で長さの(連続した)サブアレイに配列を分割しますK
。分割後、各サブアレイは、サブアレイの最大値になるように変更され、それらの値を有しています。分割後に指定された配列の最大の合計を返します。
例1:
入力:A = [1,15,7,9,2,5,10]、K = 3 出力:84 説明:Aはなる[15,15,15,9,10,10,10]
注意:
1 <= K <= A.length <= 500
0 <= A[i] <= 10^6
ソリューションの概要: [:I 0]が利用可能な最大とすることができるDP [I] [j]は、i番目のアレイのj番目の要素の最後の要素を示し、Aは仮定する。そこDP [I] [J] = MAX(DP [I]、[J]、DP [M] [J-1] + MAX_VAL [M + 1] [i]は*(IM))(IK <M <私)。
コードは以下の通りであります:
クラス溶液(オブジェクト): DEF maxSumAfterPartitioning(自己、A、K): "" " :タイプA:リスト[INT] :タイプK:INT :RTYPE:INT """ インポート数学 DP = [] MAX_VAL = [] サブ = INT(math.ceil(フロート(LEN(A))/ K)) のために私に: dp.append([0] * サブ) max_val.append([0] * (A)LEN) のための I における範囲(LEN(A)): MAX_VAL [I] [I]= A [i]の ための J における範囲(I + 1 、LEN(A)): MAX_VAL [I] [J] = MAX(MAX_VAL [I]、[J-1 ]、A [J]) DP [0] [ 0] = [0] 用の I における範囲(LEN(A)) のために、J における範囲(サブ): #印刷I、J なら IK < 0: DP [I] [J] = MAX([0: I + 1])*(I + 1 ) 他: のための M における範囲(I- K、I): DP [I] [J] = MAX(DP [I]、[J]、DP [M] [J-1] + MAX_VAL [M + 1] [I] *(I- M)) #の印刷のDP 戻り DP [ -1] [ - 1]
ます。https://www.cnblogs.com/seyjs/p/11044749.htmlで再現