Re: [閒聊] 每日leetcode

看板Marginalman作者 (神楽めあ的錢包)時間1年前 (2024/10/31 15:26), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1066/1548 (看更多)
2463. Minimum Total Distance Traveled array : robot,robot[i]為第i個機器人一開始的位置 array : factory factory[j][0]為第j個工廠的位置、factory[j][1]為第j個工廠可以修理的機器人上限 每個機器人的位置一開始不會重複 每個工廠的位置也不會重複 可以讓機器人往左或往右走 當機器人相遇時不會發生碰撞 當工廠達到修理上限時機器人就不能在進去 請問要讓所有機器人都可以被修理所需要移動的最短距離 思路: 先將robot、factory透過位置進行排序 函式dfs(i,j)回傳從第i個機器人、第j個工廠開始修理需要的最短距離 並用dp[i][j]紀錄dfs(i,j)的值 如果第j的工廠不修理機器人那 dfs(i,j)=dfs(i,j+1) (factory[j]修理0個機器人的情況) 接著我們從k=0~factory[j][1]-帶入下式 (表示factory[j]修理k+1個機器人) dfs(i,j)=min( dfs(i+k+1,j+1)) + Σ(t=0~k)abs(robot[i+t] - factory[j][0]) ) 這樣就可以得到答案了 golang code : func minimumTotalDistance(robot []int, factory [][]int) int64 { n, m := len(robot), len(factory) slices.Sort(robot) slices.SortFunc(factory, func(a, b []int) int { return a[0] - b[0] }) dp := make([][]int, n) for i := 0; i < n; i++ { dp[i] = make([]int, m) } var dfs func(int, int) int dfs = func(robot_i, factory_j int) int { if robot_i == n { return 0 } if factory_j == m { return 1e13 } if dp[robot_i][factory_j] != 0 { return dp[robot_i][factory_j] } ans := dfs(robot_i, factory_j+1) step := 0 for k := 0; k < factory[factory_j][1]; k++ { if k+robot_i >= n { break } step += abs(robot[robot_i+k] - factory[factory_j][0]) ans = min(ans, dfs(robot_i+1+k, factory_j+1)+step) } dp[robot_i][factory_j] = ans return ans } return int64(dfs(0, 0)) } func abs(i int) int { if i < 0 { return -i } return i } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.71.213.179 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1730359599.A.5CB.html
文章代碼(AID): #1d8p4lNB (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1d8p4lNB (Marginalman)