题解 | #牛舍安排问题#
牛舍安排问题
https://www.nowcoder.com/practice/b56eb97b8b5941d3a14cd4ce7238f502
#include <algorithm>
#define INF 0x3f3f3f3f
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param houses int整型vector
* @param k int整型
* @return int整型
*/
int cost_fun(vector<int>& houses, int i, int j) {
int mid = (i + j) >> 1;
int cost = 0;
for (int h = i; h <= j; ++h)
{
cost += abs(houses[h] - houses[mid]);
}
return cost;
}
int dp_fun(vector<int>& dp, vector<vector<int>>& cost, int i) {
int minv = cost[0][i];
for (int m = 1; m <= i; ++m) {
minv = min(minv, dp[m - 1] + cost[m][i]); // [0---m-1]分配j-1 [m---i]分配1
}
return minv;
}
int minTotalDistance(vector<int>& houses, int k) {
// 计算cost数组
vector<vector<int>> cost(houses.size(), vector<int>(houses.size(), 0));
for (int i = 0; i < houses.size(); i++)
{
for (int j = i; j < houses.size(); j++)
{
cost[i][j] = cost_fun(houses, i, j);
}
}
// dp数组 init 仅与 j-1
vector<int> dp(houses.size(), INF); // [i,j=0]
for (int j = 1; j < k + 1; ++j) {
for (int i = houses.size()-1; i >= 0; --i) {
// 求得最小值
dp[i] = dp_fun(dp, cost, i);
}
dp[0] = 0;
}
return dp[houses.size()-1];
}
};
阿里云工作强度 603人发布
