题解 | #牛舍安排问题#动态规划

牛舍安排问题

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

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param houses int整型一维数组 
# @param k int整型 
# @return int整型
#
class Solution:
    def minTotalDistance(self , houses: List[int], k: int) -> int:
        houses.sort()  # 排序牛舍位置
        n = len(houses)
        
        # 创建动态规划数组
        dp = [[0] * (k + 1) for _ in range(n)]
        
        # 计算任意两个牛舍之间的距离
        def calculate_distance(i, j):
            return abs(houses[i] - houses[j])

        # 填充动态规划数组
        for i in range(n):
            for j in range(k + 1):
                if j == 0:
                    dp[i][j] = 0
                elif i == 0:
                    dp[i][j] = 0
                elif j == 1:
                    dp[i][j] = calculate_distance(0, i)
                else:
                    min_dist = float('inf')
                    for x in range(i):
                        min_dist = min(min_dist, dp[x][j - 1] + calculate_distance(x + 1, i))
                    dp[i][j] = min_dist

        # 返回最小距离总和
        return dp[n - 1][k]

1. 定义动态规划数组: 创建一个二维动态规划数组 dp,其中 dp[i][j] 表示将前 i 个牛舍分成 j 个喂食区时的最小距离总和。

2. 初始化动态规划数组: 初始化动态规划数组 dp。对于 dp[i][1],它表示只有一个喂食区,那么最小距离总和就是最后一个牛舍与第一个牛舍的距离。对于 dp[i][j]j > 1),我们可以将它分解成两部分:

  • 一个喂食区位于 houses[i] 处,此时 dp[i][j] = dp[i-1][j-1]
  • 一个喂食区位于 houses[i] 之前的某个位置 houses[x] 处,此时 dp[i][j] = dp[x][j-1] + (houses[i] - houses[x]),其中 x 的范围是 [0, i-1]

3. 填充动态规划数组: 使用两个嵌套循环来填充动态规划数组 dp,外循环遍历牛舍的位置 i,内循环遍历喂食区的数量 j。在填充过程中,根据上述初始化步骤中的公式来更新 dp[i][j]

4. 寻找最小距离总和: 在填充完整个动态规划数组后,最小距离总和将位于 dp[n-1][k],其中 n 是牛舍位置的数量,k 是喂食区的数量。

5. 返回结果: 返回 dp[n-1][k] 作为最小距离总和的答案。

全部评论
题目中测试用例第二个过不了。
点赞 回复 分享
发布于 2023-11-30 12:34 河南

相关推荐

06-20 14:27
中山大学 C++
rt,day3就开始接需求
星际探神:你就想 你是水货他们都没面出来 他们也水 管他呢
点赞 评论 收藏
分享
05-12 17:28
已编辑
门头沟学院 硬件开发
ldf李鑫:不说公司名祝你以后天天遇到这样的公司
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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