LeetCode1000。ストーンをマージするための最小コスト(間隔DP)

冷たい神の質問によると  https://leetcode.com/problems/minimum-cost-to-merge-stones/discuss/247567/JavaC%2B%2BPython-DP

トピック:

連続するKの石の山を1つの山に組み合わせることができるたびに、コストはKの山の合計です。すべての石を1つの山にまとめる最小コストを尋ねます。これが不可能な場合は、-1が返されます。

解決策:

、K反応器は、反応器になるたびに、それは、これだけに、各時刻k-1マイナスヒープ、最後に残ったヒープを言うことであるため、   (N - 1 - )%(K 1 ==)0   CAN 1パイルを合成します。

 

 dp [i] [j]  は  、可能な限りマージした後の石[i..j]の最小コストを表し   ます。

 

次に、i番目の石と最初の数石を列挙して、山を形成します。長さが1 +(K- 1)* xの場合にのみ     、束を組み合わせることができるため、列挙の長さは毎回K- 1ずつ増加し    ます。

 

クラスSolution {
 public int mergeStones(vector < int >&stones、int K){
         int n = stones.size();
        if((n- 1)%(K- 1))return - 1 ; 
        vector < int > prefix(n + 1 );
        forint i = 1 ; i <= n; i ++)prefix [i] = prefix [i- 1 ] + stones [i- 1 ]; 
        ベクトル <vector < int >> dp(n、vector <int >(n、0 ));
         // ji <Kをマージする必要がないため、値は0 
        forint l = K- 1 ; l <n; l ++ ){
             forint s = 0 ; s + l < n; s ++ ){
                 int e = s + l; 
                dp [s] [e] = INT_MAX;
                 forint m = s; m <e; m + = K- 1 ){ 
                    dp [s] [e] = min (dp [s] [e]、dp [s] [m] + dp [m + 1 ] [e]); 
                } 
                //l%(K-1)== 0バンチを合成できるのは偶然です
                 // 列挙は左の合成バンチであるため、左と右の加算はバンチより大きくなければならないので、// 最も単純な状態ではないため、
                 もう一度マージしてマージする必要があります。値は間隔であり、
                if(l%(K- 1)== 0 ){ 
                    dp [s] [e] + = prefix [e + 1 ] -prefix [s]; 
                } 
            } 
        } 
        return dp [ 0 ] [n- 1 ]; 
    } 
};

 

おすすめ

転載: www.cnblogs.com/wenruo/p/12717004.html