冷たい神の質問によると 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 ); for(int i = 1 ; i <= n; i ++)prefix [i] = prefix [i- 1 ] + stones [i- 1 ]; ベクトル <vector < int >> dp(n、vector <int >(n、0 )); // ji <Kをマージする必要がないため、値は0 for(int l = K- 1 ; l <n; l ++ ){ for(int s = 0 ; s + l < n; s ++ ){ int e = s + l; dp [s] [e] = INT_MAX; for(int 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 ]; } };