Untitled
unknown
c_cpp
a year ago
1.6 kB
7
Indexable
#include <vector> #include <algorithm> #include <iostream> #include <climits> using namespace std; int getMinTotalDistance(vector<int> dist_centers) { int n = dist_centers.size(); // Sort the distribution centers sort(dist_centers.begin(), dist_centers.end()); // Calculate prefix sums of positions vector<int> prefix_sum(n + 1, 0); for (int i = 0; i < n; ++i) { prefix_sum[i + 1] = prefix_sum[i] + dist_centers[i]; } // Helper function to calculate the cost of placing one warehouse for a given range auto get_cost = [&](int start, int end) { int mid = (start + end) / 2; int median = dist_centers[mid]; int cost = 0; for (int i = start; i <= end; ++i) { cost += abs(dist_centers[i] - median); } return cost; }; // dp[i][k]: minimum cost for placing k warehouses up to the i-th distribution center vector<vector<int>> dp(n + 1, vector<int>(3, INT_MAX)); dp[0][0] = 0; // Fill the dp table for (int k = 1; k <= 2; ++k) { for (int i = 1; i <= n; ++i) { for (int j = 0; j < i; ++j) { dp[i][k] = min(dp[i][k], dp[j][k - 1] + get_cost(j, i - 1)); } } } // Return the result: minimum cost for placing 2 warehouses for all n centers return dp[n][2]; } // Example usage int main() { vector<int> dist_centers = {1, 2, 3}; cout << getMinTotalDistance(dist_centers) << endl; // Output: 1 dist_centers = {1, 6}; cout << getMinTotalDistance(dist_centers) << endl; // Output: 0
Editor is loading...
Leave a Comment