水銀メモ_________φ

外部記憶装置として再開

CodeForces #267_Div2 : C. George and Job

Problem - C - Codeforces

問題

大きさnの整数配列pが与えられる。
この配列の内、重複しない大きさmの区間をk個選択した時の合計値を最大化させたい。

解法

動的計画法
dp[ i ][ j ] := j番目のindexに位置し、i個の区間を選択済時の最大値

例えば、j番目のindexから始まる区間を選択する場合は以下のように更新を行う。
dp[ i+1 ][ j + m ] = max(dp[i + 1][j + m -1], dp[i][j] + (jからj+m-1までの和))

和の計算は事前に累積和を求めておくことでO(1)で得られるため、
全体の計算量はO(nk)となる。

Javaで空間計算量がO(nk)となるとギリギリMLEとなってしまうので、
配列の再利用ができるように、k → nの順でループを回し空間計算量をO(n)で抑える。

ソース