题解 | #牛舍安排问题#

牛舍安排问题

https://www.nowcoder.com/practice/b56eb97b8b5941d3a14cd4ce7238f502

int calMinDistance(int* house, int housesLen, int index) {
    int totalDistance = 0;
    int median = (housesLen + index) / 2;

    for (int i = index; i < housesLen; ++i) {
        int distance = house[i] > house[median] ? house[i] - house[median] :
                       house[median] - house[i];
        totalDistance += distance;
    }

    return totalDistance;
}


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param houses int整型一维数组
 * @param housesLen int houses数组长度
 * @param k int整型
 * @return int整型
 */
int minTotalDistance(int* houses, int housesLen, int k) {

    // 定义动态规划数组,dp[i][j]表示前i栋牛舍分配j个喂食区的情况下,
    // 前i栋牛舍离最近的喂食区之前的距离总和最小值
    int** dp = (int**)malloc(sizeof(int*) * (housesLen + 1));
    for (int i = 0; i < housesLen + 1; ++i) {
        dp[i] = (int*)malloc(sizeof(int) * (k + 1));
    }

    // 处理边界值,若牛舍数量为0,则无论分配多少个喂食区,距离之和都是0
    for (int j = 0; j < k + 1; ++j) {
        dp[0][j] = 0;
    }

    // 定义初始值,只要牛舍数量不为0,那么默认距离之和为最大值
    for (int i = 1; i < housesLen + 1; ++i) {
        for (int j = 0; j < k + 1; ++j) {
            dp[i][j] = 2147483627;
        }
    }

    // 遍历处理,i代表前i栋牛舍
    for (int i = 1; i < housesLen + 1; ++i) {
        // j代表分配j个喂食区
        for (int j = 1; j < k + 1; ++j) {
            // m表示把前m个牛舍分配j-1个喂食区,
            // 剩下的i-m个牛舍分配1个喂食区
            for (int m = 0; m < i; ++m) {
                if (dp[m][j - 1] == 2147483627) continue;
                if (dp[i][j] > dp[m][j - 1] + calMinDistance(houses, i, m)) {
                    dp[i][j] = dp[m][j - 1] + calMinDistance(houses, i, m);
                }
            }
        }
    }

    int result = dp[housesLen][k];

    for (int i = 0; i < housesLen + 1; ++i) {
        free(dp[i]);
    }
    free(dp);

    return result;
}

全部评论

相关推荐

03-26 13:04
已编辑
电子科技大学 算法工程师
xiaowl:你这个简历“条目上”都比较有深度性,但是实际上面试官又没法很好的评估你是怎么达到很多看上去很厉害的结果的。要避免一些看上去很厉害的包装,比如高效的内存复用策略的表达,如果仅是简单的一些内存共享机制,而且面试上也没有深挖的空间,就不要这样表达。比如,工程化模式本质上可能就是定义了一些abstract class,那也就没特别多值得讲的内容。建议简历上应该侧重那些你花了大量时间和精力解决、研究的问题,不要过分追求“丰富”,而是关注在技术深入度、问题解决能力的表现上。
没有实习经历,还有机会进...
点赞 评论 收藏
分享
03-10 11:23
门头沟学院 Java
鹿LF:计算机面试就跟数学题一样,没什么实际价值,但只能这么筛选,本质是考察你的努力,智力和学习能力
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务