class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param houses int整型vector
     * @param k int整型
     * @return int整型
     */
    int minTotalDistance(vector<int>& houses, int k) {
        // write code here
        sort(houses.begin(), houses.end());
        int n = houses.size();

        // 初始化dp数组
        vector<vector<int>> dp(n + 1, vector<int>(k + 1, INT_MAX / 2));
        dp[0][0] = 0;

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= min(i, k); j++) {
                for (int p = 0; p < i; p++) {
				  	//在已有分区的情况下,对加入的新牛棚重新按p位置进行分区,重新计算最小值
                    dp[i][j] = min(dp[i][j], dp[p][j - 1] + houses[i - 1] - houses[p]);
                }
            }
        }

        return dp[n][k];
    }
};