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

Bài hôm nay có thể giải bằng 2 cách: quy hoạch động hoặc dùng công thức toán
uzQb2yt.png



* Nghĩ hoài không ra, toán không phải là thế mạnh của vozer
yBBewst.png
 
Bài hôm nay có thể giải bằng 2 cách: quy hoạch động hoặc dùng công thức toán
uzQb2yt.png



* Nghĩ hoài không ra, toán không phải là thế mạnh của vozer
yBBewst.png
Hôm nọ e xem pv Ngô Quý Đăng HCV IMO thấy có nhắc đến cái problem này, đoạn 3:20

Cái này là bài tổ hợp cấp 2 vs mấy đứa chuyên toán thôi. Công thức là tổ hợp chập (m-1) của (m+n-2)
 
Hôm nọ e xem pv Ngô Quý Đăng HCV IMO thấy có nhắc đến cái problem này, đoạn 3:20

Cái này là bài tổ hợp cấp 2 vs mấy đứa chuyên toán thôi. Công thức là tổ hợp chập (m-1) của (m+n-2)
xưa đi pvan gặp bài này nhưng đọc cách giải bằng toán không được ưng, lúc đó chưa biết đến quy hoạch động :doubt:
 
Bài hôm nay có thể giải bằng 2 cách: quy hoạch động hoặc dùng công thức toán
uzQb2yt.png



* Nghĩ hoài không ra, toán không phải là thế mạnh của vozer
yBBewst.png
Lúc print cái dp ra thấy nó có quy luật, nên t đoán là có thể dùng ct toán để giải mà nghĩ k ra nên bỏ qua. :D
 
Bài hôm nay có thể giải bằng 2 cách: quy hoạch động hoặc dùng công thức toán
uzQb2yt.png



* Nghĩ hoài không ra, toán không phải là thế mạnh của vozer
yBBewst.png
tìm công thức toán dễ lắm, quay cái mảng 2 chiều đó 1 góc 45 độ theo chiều kim đồng hồ là ra tam giác pascal à
GYA3x5J.gif


1659323593648.png


1 2 1
1 3 3 (1)
1 4 6 (4 1)
1 5 10 (10 5 1)

đấy tam giác pascal, bèo ròi
irGoYrZ.gif


số 28 là số hạng trong (1+1)^8 nên C(N,K) có N = 8 = 3 + 7 - 2 = n+m-2
số 28 là C(8,6), 6 = 8 - 2 thật ra 2 là m-1, vậy công thức tổng quát là C(n+m-2, n+m-2-(m-1)) = C(n+m-2, n-1) = (n+m-2)! / [(n-1)!(m-1)!]

lợi dụng tính chất ví dụ C(9,3) = (9*8*7) / (1*2*3) = (9*8) / (1*2) * 7 / 3 = C(9, 2) * 7 / 3 = C(9, 1) * 8 / 2 * 7 / 3 có thể tính lẹ C(n, k) trong O(min(n, n-k))
C++:
int uniquePaths(int m, int n) {
    int N = n + m - 2;
    int K = std::min(n, m) - 1;
    long long res = 1;
    for (int i = 1; i <= K; ++i) res = res * N-- / i;
    return static_cast<int>(res);
}
irGoYrZ.gif
 
Last edited:
Bài hôm nay có thể giải bằng 2 cách: quy hoạch động hoặc dùng công thức toán
uzQb2yt.png



* Nghĩ hoài không ra, toán không phải là thế mạnh của vozer
yBBewst.png
Đang ngồi lấy giấy ra định xem công thức toán của bác có đúng ko thì :beat_brick:
 
Vẽ ra giấy cái là nhìn ra ngay tam giác pascal
C++:
class Solution {
public:
    int uniquePaths(int m, int n) {
        auto rank = m + n - 2;
        if (rank < 2)
            return 1;
        int64_t result = 1;
        for (auto i = 1; i<min(m,n);i++){
            result *= (rank - i + 1);
            result /= i;
        }
        return (int)result;
    }
};
 
Ngoài lề chút có bài này nhờ mấy thím giúp đỡ về ý tưởng ạ :cry: Mình bruteforce thì ra rồi mà không nghĩ ra được ý tưởng nào hay hơn
Code:
You are given a string S of length N and an array p representing a permutation of numbers from 1 to N. You shuffle the string as follows:

· In one shuffle operation, you replace the character S[i] with S[p[i]].

· You repeatedly do this operation untill you get back S.

· Find the number of operations performed.

Example:

n = 5

s = "ababa"

p = 2,1,4,5,3

The string will change as follows:

s = babaa

s = abaab

s = baaba

s = abbaa

s = baaab

s = ababa

Therefore, number of shuffling operations performed is 6.
2,1,4,5,3 có thể chuyển về cái đồ thị
2 -> 1
1 -> 2
4 -> 3
5 -> 4
3 -> 5
rồi tìm các đồ thị vòng, ví dụ ở đây có 1-2-1 và 4-3-5-4, lấy x = BCNN của độ dài của các đồ thị vòng là tương đối ra. Nhưng còn vướng lỡ ví dụ s[1] và s[2] giống nhau thì dù có shuffle nhưng chuỗi s[1..2] cũng có thay đổi đâu, nên toy cũng ko biết :shame: có thể là kiểm tra nếu tất cả các s[i\] trong 1 đồ thị vòng nào mà giống nhau hết thì độ dài của đồ thị vòng đó là 1
QwJ0V0V.png
 
Last edited:
Code:
func kthSmallest(matrix [][]int, k int) int {
    arrMatrix := make([]int, 0)
    for _, rows := range matrix {
        for _, value := range rows {
            arrMatrix = append(arrMatrix, value)
        }
    }
    sort.Ints(arrMatrix)
    return arrMatrix[k-1]
}

Bài hôm nay làm kiểu nông dân hệ không chuyên. Còn chuyên thì đoạn sau dùng quick select :D
Bài tương tự nhưng là array : 215. Kth Largest Element in an Array
 
Last edited:
Thím nào rảnh có thể thử sức bài này, medium mà mình thấy khá chua mà cũng hay
g8XXj8u.gif

https://leetcode.com/problems/exam-room/
lịt pẹ tưởng ngon ăn code thử đẻ ra corner case tùm lum
Jjqt3oq.png


https://leetcode.com/submissions/detail/764128089/
toy xài 1 cái set<pair<int,int>> Q để lưu các khoảng cách sorted từ lớn tới bé, vd {4-9, 0-2, 2-4}, 1 cái map<int, pair<int,int>> M vd -1:0:2, 0:2:4, 2:4:9, 4:9:-1 để biết bên trái bên phải mỗi số p là gì cho leave(p) vd leave(2) biết đường mà xóa 0-2, 2-4 và insert 0-4 lại trong Q, thế đéo nào mà memory 13.40%
Wk0ydPR.gif
 
lịt pẹ tưởng ngon ăn code thử đẻ ra corner case tùm lum
Jjqt3oq.png


https://leetcode.com/submissions/detail/764128089/
toy xài 1 cái set<pair<int,int>> Q để lưu các khoảng cách sorted từ lớn tới bé, vd {4-9, 0-2, 2-4}, 1 cái map<int, pair<int,int>> M vd -1:0:2, 0:2:4, 2:4:9, 4:9:-1 để biết bên trái bên phải mỗi số p là gì cho leave(p) vd leave(2) biết đường mà xóa 0-2, 2-4 và insert 0-4 lại trong Q, thế đéo nào mà memory 13.40%
Wk0ydPR.gif
mình cũng bị @san1201 dí cho bài này thím, bắn nó
Vm92EyD.png
 
Back
Top