説明
あります n
ライン上の家は。配列を指定 A
して A[i]
の位置を表す i-th
家を。今、あなたは選択する必要が k
構築するための位置 k
のポストオフィスを。
これらの最小和距離は何である n
最寄りの郵便局への家は?
すべてのポジションは整数です。
例
例1:
Input: A = [1, 2, 3, 4, 5], k = 2
Output: 3
Explanation: Build post offices on position 2 and 4.
例2:
Input: A = [1, 2], k = 1
Output: 1
Explanation: Build post office on position 1 or 2.
チャレンジ
O(N ^ 2 )の時間
アイデア:
線形動的プログラミング(よりむしろ動的プログラミングの範囲)
缶郵便局最寄りの各家、入れ n
分け家 k
セグメントを、そして私たちが決めなければならないが、このある k
セグメントの長さである。私たちは家の前の位置のソートに対処を助けるために。
:この決定のための私のポストオフィスは、それがあるので、どのように多くの家は、i番目の郵便局を共有している前に、我々は状態jに必要なことであるときF [i]の[j]を設定すると、最適解の成立前にJの家を表し
f[i][j] = min{f[i - 1][j - x] + sumdis[j - x][j - 1]}
其中 sumdis[l][r] 表示下标范围为 [l, r] 的房子之间建立一个邮局, 这些房子与该邮局的最短距离
(注意f[i][j]中的j表示的第j栋房子从1计数, sumdis从0计数)
sumdisアレイは、前出て実現され、直接セレクトRメジアンsumdis [L] [R]に関連するアルゴリズムの特定の性質することができる - 。中間郵便局ことを立証L + 1つの住宅(IF次いで、距離や家屋も洞、両者の必要に応じて中間体)は、ポストオフィスは、最短です。
F [i]が[0] = 0、F [0] [J] = INF、及びI> = j個のF [I] [J] = 0:境界DPとして
さらに、そのような状態は、定義された配列の最適化をスクロールさせることができます。
パブリッククラスソリューション{ / ** * @paramのA整数配列 * @param kを整数 * @return整数 * / INT [] []のinit(INT [] A){ int型のn = A.length。 INT [] [] DIS =新しいINT [N + 1] [N + 1]。 以下のために(INT I 1 =; I <= N; I ++){ ため(INT J = I + 1、J <= N; ++ J){ int型ミッド=(I + J)/ 2。 (; K <= J; ++ K int型K = i)に対する DIS [I] [J] + = Math.abs(A [ミッド- - 1] A [ - 1、K])。 } } DISを返します。 } 公共INTポストオフィス(INT [] A、int型K){ //ここにコードを書きます int型のn = A.length。 Arrays.sort(A)。 INT [] [] DIS = INIT(A)。 INT [] [] DP =新しいINT [N + 1] [K + 1]。 IF(N == 0 || K> = A.length) 戻り0; int型ANS = Integer.MAX_VALUEで、 以下のために(INT I 0 =; I <= N; ++ I){ DP [I] [1] = DIS [1]〜[I]。 } のための(INT NK = 2; NK <= K; NK ++){ (INT I = NK; I <= N; I ++){ため DP [I] [NK] = Integer.MAX_VALUEの; 用(INT J = 0; J <I、J ++){ IF(DP [I] [NK] == Integer.MAX_VALUEの|| DP [I] [NK]> DP [J] [NK - 1] + DIS [ J + 1] [I]) } 戻りDP [n]が[K]。 DP [I] [NK] = DP [J] [NK - 1] + DIS [J + 1] [i]は、 } } } }