郵便局の問題

説明

あります  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]は、
                } 
            } 
    } 
}

  

おすすめ

転載: www.cnblogs.com/FLAGyuri/p/12078315.html