|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目描述:
- 给你一个房屋数组houses 和一个整数 k ,其中 houses[i] 是第 i 栋房子在一条街上的位置,现需要在这条街上安排 k 个邮筒。
- 请你返回每栋房子与离它最近的邮筒之间的距离的 最小 总和。
- 答案保证在 32 位有符号整数范围以内。
-  
- 示例 1:
- 输入:houses = [1,4,8,10,20], k = 3
- 输出:5
- 解释:将邮筒分别安放在位置 3, 9 和 20 处。
- 每个房子到最近邮筒的距离和为 |3-1| + |4-3| + |9-8| + |10-9| + |20-20| = 5 。
- 示例 2:
- 输入:houses = [2,3,5,12,18], k = 2
- 输出:9
- 解释:将邮筒分别安放在位置 3 和 14 处。
- 每个房子到最近邮筒距离和为 |2-3| + |3-3| + |5-3| + |12-14| + |18-14| = 9 。
- 示例 3:
- 输入:houses = [7,4,6,1], k = 1
- 输出:8
- 示例 4:
- 输入:houses = [3,6,14,10], k = 4
- 输出:0
-  
- 提示:
- n == houses.length
- 1 <= n <= 100
- 1 <= houses[i] <= 10^4
- 1 <= k <= n
- 数组 houses 中的整数互不相同。
- 来源:力扣(LeetCode)
- 链接:https://leetcode-cn.com/problems/allocate-mailboxes
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码
- class Solution {
- public:
- int minDistance(vector<int>& houses, int k) {
- sort(houses.begin(),houses.end());//注意这一步
- int len = houses.size();
- vector<vector<int> >cost(len, vector<int>(len, 0));
- for(int i = 0; i < len; i++){
- for(int j = i + 1; j < len; j++){
- int mid = (i + j) / 2;//注意这里的写法
- for(int k = i; k <= j; k++){
- cost[i][j] += abs(houses[k]-houses[mid]);
- }
- }
- }
- vector<vector<int> > dp(len, vector<int>(k + 1, INT_MAX));
- for(int i = 0; i < len; i++){
- dp[i][1] = cost[0][i];
- }
- for(int i = 0; i < len; i++){
- for(int j = 2; j <= k; j++){
- for(int k = j - 1; k <= i; k++){
- dp[i][j] = min(dp[i][j], dp[k-1][j-1] + cost[k][i]);
- }
- }
- }
- return dp[len-1][k];
- }
- };
复制代码
参考链接:https://leetcode-cn.com/problems ... -tong-by-qi-yi-lin/ |
|