thảo luận Leetcode mỗi ngày

  • Người tạo chủ đề Người tạo chủ đề _Gia_Cat_Luong_
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
Bài hôm nay ít người làm thế nhỉ
osCpCsi.png
 
Nghĩ là có cách greedy nhưng mà constrain thấp quá nên làm DP cũng pass :ah: ăn 1 bug do ko nghĩ là capacity của nhà máy cũng = 0 nữa
Python:
class Solution:
    def minimumTotalDistance(self, robot: List[int], factory: List[List[int]]) -> int:
        robot = sorted(robot)
        n = len(robot)
        factory = sorted(factory)

        m = len(factory)
        @lru_cache(None)
        def go(i, j, capacity):
            if i == n:
                return 0
          
            if j == m:
                return inf

            skip = go(i, j + 1, factory[j + 1][1] if j + 1 < m else 0)
            take = inf

            if capacity > 0:
                take = abs(robot[i] - factory[j][0]) + go(i + 1, j, capacity - 1)

            return min(skip, take)

        return go(0, 0, factory[0][1])
1730342534824.png

Ồ cách flatten cái capacity của factory hay phết, đỡ phải lưu thêm 1 state trong DP function nhưng time complexity là như nhau
 
Bài hôm nay khó ác, cũng nghĩ là dp nhưng không biết xử lý cái limit ra sao. Đành phải vào solution thì mới biết nó dup cái position bằng với limit trong factory pos array luôn, hay phết.
 
C++:
class Solution {
public:
    long long minimumTotalDistance(vector<int>& robot, vector<vector<int>>& factory) {
        sort(robot.begin(), robot.end());
        sort(factory.begin(), factory.end());
        vector<vector<vector<long long>>> dp(
            robot.size(),
            vector<vector<long long>>(
                factory.size(),
                vector<long long>(robot.size() + 1, -1)
            )
        );
        return f(robot, factory, 0, 0, 0, dp);
    }
    long long f(vector<int>& robot, vector<vector<int>>& factory, int i, int j, int used, vector<vector<vector<long long>>>& dp) {
        if (j == factory.size()) return LLONG_MAX / 2;
        if (i == robot.size()) return 0;
        if (dp[i][j][used] != -1) return dp[i][j][used];
        long long not_take = f(robot, factory, i, j + 1, 0, dp);
        long long take_current = LONG_MAX;
        if (used < factory[j][1]) {
            take_current = f(robot, factory, i + 1, j, used + 1, dp) + abs(1LL * robot[i] - factory[j][0]);
        } else {
            take_current = f(robot, factory, i, j + 1, 0, dp);
        }
        return dp[i][j][used] = min(take_current, not_take);
    }
};
 
bài hôm nay khó ở đoạn chứng minh ban đầu là sorting works :beat_brick:
Giả sử có 4 điểm, 2 con robot ở A B và 2 điểm C D tạo thành 1 hình chữ nhật A B C D thì tổng độ dài 2 đường chéo luôn lớn hơn tổng độ dài 2 cạnh bên mà. Nên việc cần làm là cần tránh tình trạng giao nhau giữa các đường di chuyển của robot. Nên việc sorting sẽ chắc chắn optimal.
Lúc đầu mình nghĩ tới 2 pointers, nhưng mà 2 pointers thì sẽ ko có cách nào chọn cái factory cho optimal cả nên DP sẽ ăn. Nhìn constrain thấp nên dùng DP ăn cũng dễ hiểu

via theNEXTvoz for iPhone
 
Giả sử có 4 điểm, 2 con robot ở A B và 2 điểm C D tạo thành 1 hình chữ nhật A B C D thì tổng độ dài 2 đường chéo luôn lớn hơn tổng độ dài 2 cạnh bên mà. Nên việc cần làm là cần tránh tình trạng giao nhau giữa các đường di chuyển của robot. Nên việc sorting sẽ chắc chắn optimal.
Lúc đầu mình nghĩ tới 2 pointers, nhưng mà 2 pointers thì sẽ ko có cách nào chọn cái factory cho optimal cả nên DP sẽ ăn. Nhìn constrain thấp nên dùng DP ăn cũng dễ hiểu

via theNEXTvoz for iPhone
Rõ rồi sếp :D
Mà sếp gạch em vừa chứ nick em vẫn Junior mà ăn gạch mãi thế sao lớn nổi =((
 
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
_Gia_Cat_Luong_,
Người trả lời cuối
Vipluckystar,
Trả lời
17.755
Lượt xem
1.213.998
Quay lại
Lên đầu trang