thảo luận Leetcode contest, đường tới Guardian

  • Người tạo chủ đề Người tạo chủ đề freedom.9
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
code ông này nhìn giống code t phết.

Python:
class Solution:
    def maximumLength(self, nums: List[int], k: int) -> int:
        @cache
        def dfs(idx, num_diff):
            if num_diff > k or idx == len(nums):
                return 0
            ret = 1
            for i in range(idx + 1, len(nums)):
                ret = max(ret, 1 + dfs(i, num_diff + int(nums[idx] != nums[i])))
            return ret
        return max(dfs(i, 0) for i in range(len(nums)))

Mà bài 4 làm ntn bị TLE. tối ưu ntn thế? :beauty:
Q4
Python:
class Solution:
    def maximumLength(self, nums: List[int], k: int) -> int:
        n = len(nums)
        dp = [[0] * n for _ in range(k + 1)]
       
        for diff in range(k + 1):
            posMap = {}
            prefixMax = 0
            for end in range(n):
                dp[diff][end] = 1 + max(
                    prefixMax if k - 1 >= 0 and end - 1 >= 0 else 0,
                    dp[diff][posMap[nums[end]]] if nums[end] in posMap else 0
                )
                prefixMax = max(prefixMax, dp[diff - 1][end] if diff > 0 else 0)
                posMap[nums[end]] = end
       
        return max(dp[k])
Dùng prefix-max của dp và tham lam thôi bác
 
Python:
Q4
class Solution:
    def maximumLength(self, nums: List[int], k: int) -> int:
        n = len(nums)
        dp = [[0] * n for _ in range(k + 1)]
       
        for diff in range(k + 1):
            posMap = {}
            prefixMax = 0
            for end in range(n):
                dp[diff][end] = 1 + max(
                    prefixMax if k - 1 >= 0 and end - 1 >= 0 else 0,
                    dp[diff][posMap[nums[end]]] if nums[end] in posMap else 0
                )
                prefixMax = max(prefixMax, dp[diff - 1][end] if diff > 0 else 0)
                posMap[nums[end]] = end
       
        return max(dp[k])
Dùng prefix-max của dp và tham lam thôi bác
Luyện bao lâu rồi vẫn chưa quen cái dp dùng thêm prefix, :beat_shot: . Chắc do quen code dp kiểu top-down rồi. Chắc phải chuyển qua luyện viết bottom-up dần thôi.
 
Nhưng mà mấy thằng C++ vẫn pass đó fence, nhìn đây
C++:
#define ll long long
int dp[503][503][26];


int find(int pos, int prev, int cnt, vector<int> &nums)
{
    if(pos == nums.size())
        return 0;
   
    int ans = -1;

    if(dp[pos][prev+1][cnt] != -1)
        return dp[pos][prev+1][cnt];
   
    if(prev == -1) // prev = -1 implies the the subsequence has not started
    {
        ans = max(ans, find(pos+1, -1, cnt, nums)); // not starting
        ans = max(ans, 1 + find(pos+1, pos, cnt, nums)); //starting
    }
   
    else
    {
        if(nums[pos] == nums[prev]) // if prev == curr no need to reduce the cnt when adding to subsequence
        {
            ans = max(ans, find(pos+1, prev, cnt, nums));
            ans = max(ans, 1 + find(pos+1, pos, cnt, nums));
        }
       
        else
        {
            ans = max(ans, find(pos+1, prev, cnt, nums));
           
            if(cnt > 0) // make sure cnt > 0 before adding a number not equal to the previous.
                ans = max(ans, 1 + find(pos+1, pos, cnt-1, nums));
        }
   
    }
       
    return dp[pos][prev+1][cnt] = ans;
}


class Solution {
public:
    int maximumLength(vector<int>& nums, int k) {
       
        memset(dp, -1, sizeof(dp));
       
        int ans = find(0, -1, k, nums);
        return ans;
    }
};
C++ nó ăn gian, chơi allocate hết trên stack, :ah:
 
Toy bị mấy lần bị cái vụ này rồi fence, thôi từ sau cứ theo template mà táng chứ ko chơi kiểu prev, current nữa.
T cũng từng bị TLE kiểu đó rồi. Xét về độ phức tạp thì nó ổn.
Code hiện tại của fen t chưa xem kỹ lắm. Nhưng theo t nghĩ thì vấn đề nó nằm ở cái cache. Cache như vậy sẽ k hiệu quả. K tin thì fen thử viết thêm 1 đoạn code để tính số lần write, read, hit, miss của cache. So sánh 2 cách là sẽ thấy
 
T cũng từng bị TLE kiểu đó rồi. Xét về độ phức tạp thì nó ổn.
Code hiện tại của fen t chưa xem kỹ lắm. Nhưng theo t nghĩ thì vấn đề nó nằm ở cái cache. Cache như vậy sẽ k hiệu quả. K tin thì fen thử viết thêm 1 đoạn code để tính số lần write, read, hit, miss của cache. So sánh 2 cách là sẽ thấy
Cache như vậy nó ko hiệu quả là đúng fence, vì sẽ bị thừa space.
Chỉ cay là tính toán space complexity chỉ là 0[500*500*25] như bọn c++ thì vẫn pass mới đúng.
Còn giảm space về 0[500*25] thì ngon rồi.
via theNEXTvoz for iPhone[/i][/i]
 
Thôi mình Brute Force rồi :beat_brick:
bác Brute Force được AC không thế, em vướng 9 test case cuối
b1kGkQ6.gif
 
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
freedom.9,
Người trả lời cuối
freedom.9,
Trả lời
2.480
Lượt xem
130.264
Quay lại
Lên đầu trang