thảo luận [Học Tập] Topic thuật toán

  • Người tạo chủ đề Người tạo chủ đề unknowpc90
  • Ngày bắt đầu Ngày bắt đầu
Muốn giải quyết vấn đề giao tiếp, trình bày thì phải tăng cường giao tiếp lên. Vấn đề này phải có feedback từ người khác thì mới nhanh tiến bộ đc.

Một vấn đề lớn khi giao tiếp là mọi người thường hay giả sử là người bên kia đã biết, đã hiểu vấn đề giống như cách mình nghĩ, nên khi diễn đạt vấn đề, thường nêu không đủ ý, ko đủ rõ ràng.

Trong công việc, hoặc trong cuộc sống, nếu bạn thường xuyên thảo luận, bàn bạc vs người khác thì vấn đề này dần dần sẽ đc cải thiện. Người bạn giao tiếp sẽ liên tục đưa ra feedback để bạn nhận ra vấn đề và điều chỉnh ngay lúc đó.

Một cách khác là lên Stackoverflow trả lời câu hỏi, vì khi trả lời câu hỏi, bạn phải viết sao cho người hỏi hiểu đc bạn đang trình bày điều j, tức là bạn phải liên tục điều chỉnh level of details cho đến khi người hỏi nắm đc vấn đề. Khi reputation của bạn tăng lên tức là bạn đang tiến bộ.

Tóm lại, trong công việc, cách giao tiếp của bạn cũng thể hiện 1 phần nào level of seniority của bạn. Vì, cách bạn giao tiếp sẽ thể hiện bạn có làm việc nhóm nhiều không, có thường xuyên lead project, thảo luận technical problem ko.
 
Sửa lần cuối:
Muốn giải quyết vấn đề giao tiếp, trình bày thì phải tăng cường giao tiếp lên. Vấn đề này phải có feedback từ người khác thì mới nhanh tiến bộ đc.

Một vấn đề lớn khi giao tiếp là mọi người thường hay giả sử là người bên kia đã biết, đã hiểu vấn đề giống như cách mình nghĩ, nên khi diễn đạt vấn đề, thường nêu không đủ ý, ko đủ rõ ràng.

Trong công việc, hoặc trong cuộc sống, nếu bạn thường xuyên thảo luận, bàn bạc vs người khác thì vấn đề này dần dần sẽ đc cải thiện. Người bạn giao tiếp sẽ liên tục đưa ra feedback để bạn nhận ra vấn đề và điều chỉnh ngay lúc đó.

Một cách khác là lên Stackoverflow trả lời câu hỏi, vì khi trả lời câu hỏi, bạn phải viết sao cho người hỏi hiểu đc bạn đang trình bày điều j, tức là bạn phải liên tục điều chỉnh level of details cho đến khi người hỏi nắm đc vấn đề. Khi reputation của bạn tăng lên tức là bạn đang tiến bộ.

Tóm lại, trong công việc, cách giao tiếp của bạn cũng thể hiện 1 phần nào level of seniority của bạn. Vì, cách bạn giao tiếp sẽ thể hiện bạn có làm việc nhóm nhiều không, có thường xuyên lead project, thảo luận technical problem ko.
Em ước gì mấy group lập trình trên fb luôn có những người như bác.
Chứ hồi trước em hay lên mấy group lập trình hỏi về các vấn đề khúc mắc, thì toàn nhận lại toàn mấy cái cmt kiểu như "bạn đã tự tìm kiếm chưa", "câu này có thế cũng hỏi, tự làm đi bạn", "giải làm gì cho mệt bạn ơi",....etc.
Nên từ đó là em đếu bao h hỏi trên mấy group lập trình trên fb luôn. Giờ toàn hỏi trong Voz này
 
Em ước gì mấy group lập trình trên fb luôn có những người như bác.
Chứ hồi trước em hay lên mấy group lập trình hỏi về các vấn đề khúc mắc, thì toàn nhận lại toàn mấy cái cmt kiểu như "bạn đã tự tìm kiếm chưa", "câu này có thế cũng hỏi, tự làm đi bạn", "giải làm gì cho mệt bạn ơi",....etc.
Nên từ đó là em đếu bao h hỏi trên mấy group lập trình trên fb luôn. Giờ toàn hỏi trong Voz này
Nói đi thì cũng phải nói lại, bản thân người hỏi cũng phải suy nghĩ tương tự để mà đặt câu hỏi cho cẩn thận, rồi cung cấp đầy đủ dữ kiện , ngữ cảnh cho người ta cơ. Nhiều ông hỏi cứ như bố đời, mẹ thiện hạ thì ai muốn trả lời đâu :shame:
 
@_Gia_Cat_Luong_
Mình thấy cách này tối ưu hơn.
Python:
class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        nums.sort()
        if target < nums[0]:
            return 0
        #Init memo
        memo = [0] * (target+1)
        memo[0] = 1
        
        for i in range(nums[0], target + 1):
            memo[i] = sum(memo[i - x] for x in nums if i - x >= 0)
        return memo[target]

về cơ bản thì vẫn dùng memoization. Nhưng sẽ không bị lặp lại việc tính memoization. Do đó nó sẽ tối ưu hơn. Runtime: 40 ms, faster than 70.54% of Python3
 
Nói đi thì cũng phải nói lại, bản thân người hỏi cũng phải suy nghĩ tương tự để mà đặt câu hỏi cho cẩn thận, rồi cung cấp đầy đủ dữ kiện , ngữ cảnh cho người ta cơ. Nhiều ông hỏi cứ như bố đời, mẹ thiện hạ thì ai muốn trả lời đâu :shame:
Cũng đôi khi hên xui trái khoáy lắm bác, lấy trường hợp coding interview nhiều ông interviewer bố đời cứ thích ra câu hỏi kiểu nửa úp nửa mở, cho task không rõ ràng để người trả lời bắt buộc phải giao tiếp lại với mấy ông ấy( hoặc là tự bao hết ). Còn như trên Internet này lắm ông cũng chả chịu đầu tư chất xám gì khó quá quăng lên hỏi, không được xin code luôn.>> :look_down:
 
https://leetcode.com/problems/degree-of-an-array/
Cái bài này có thật là easy ko msây bác. Sao em thsây khó quá=((.
Chả lẻ em trình yếu thật sao
Trên Leetcode đây độ khó có nhiều bài hơi ảo bác ạ. Cứ xài được map là hay đánh dễ 🛀 🛀 .
Bài này dùng hash map là xong, nên nó sẽ là bài dễ nhất cho ctdl map, mà map mới là ctdl cơ bản thôi, chưa phải nâng cao nên là easy.
 
C++:
#include <bits/stdc++.h>

using namespace std;

long long int calBeauty(vector<vector<long long int>> &a) {
    long long int n = a.size();
    if (n == 1) return a[0][0];

    vector<vector<long long int>> aTopLeft(n / 2, vector<long long int>(n / 2, 0));
    vector<vector<long long int>> aTopRight(n / 2, vector<long long int>(n / 2, 0));
    vector<vector<long long int>> aBotLeft(n / 2, vector<long long int>(n / 2, 0));
    vector<vector<long long int>> aBotRight(n / 2, vector<long long int>(n / 2, 0));

    long long int max = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (max <= a[i][j]) max = a[i][j];
            if (i < n / 2 && j < n / 2) aTopLeft[i][j] = a[i][j];
            if (i < n / 2 && j >= n / 2) aTopRight[i][j % (n / 2)] = a[i][j];
            if (i >= n / 2 && j < n / 2) aBotLeft[i % (n / 2)][j] = a[i][j];
            if (i >= n / 2 && j >= n / 2) aBotRight[i % (n / 2)][j % (n / 2)] = a[i][j];
        }
    }
    return max + calBeauty(aTopLeft) + calBeauty(aTopRight) + calBeauty(aBotLeft) + calBeauty(aBotRight);
}

void solve() {
    int n;
    cin >> n;
    int m = sqrt(n);
    vector<vector<long long int>> a2D(m, vector<long long int>(m));
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> a2D[i][j];
        }
    }
    cout << calBeauty(a2D);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    solve();
}

https://codeforces.com/contest/313/problem/C

Test: #3, time: 0 ms., memory: 3780 KB, exit code: 0, checker exit code: 1, verdict: WRONG_ANSWER
Input
16
978618343 473608041 799158564 800910753 461479363 520477481 780529176 678879534 118274424 720632652 639921017 582019792 143353286 537373229 944668919 758615621

Output
14361969205
Answer
14440495117

Checker Log
wrong answer expected '14440495117', found '14361969205'


Sao làm mãi mà cứ sai bài này nhỉ, tính ra giấy cộng thử cũng ra 14361969205 mà=((
 
C++:
#include <bits/stdc++.h>

using namespace std;

long long int calBeauty(vector<vector<long long int>> &a) {
    long long int n = a.size();
    if (n == 1) return a[0][0];

    vector<vector<long long int>> aTopLeft(n / 2, vector<long long int>(n / 2, 0));
    vector<vector<long long int>> aTopRight(n / 2, vector<long long int>(n / 2, 0));
    vector<vector<long long int>> aBotLeft(n / 2, vector<long long int>(n / 2, 0));
    vector<vector<long long int>> aBotRight(n / 2, vector<long long int>(n / 2, 0));

    long long int max = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (max <= a[i][j]) max = a[i][j];
            if (i < n / 2 && j < n / 2) aTopLeft[i][j] = a[i][j];
            if (i < n / 2 && j >= n / 2) aTopRight[i][j % (n / 2)] = a[i][j];
            if (i >= n / 2 && j < n / 2) aBotLeft[i % (n / 2)][j] = a[i][j];
            if (i >= n / 2 && j >= n / 2) aBotRight[i % (n / 2)][j % (n / 2)] = a[i][j];
        }
    }
    return max + calBeauty(aTopLeft) + calBeauty(aTopRight) + calBeauty(aBotLeft) + calBeauty(aBotRight);
}

void solve() {
    int n;
    cin >> n;
    int m = sqrt(n);
    vector<vector<long long int>> a2D(m, vector<long long int>(m));
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> a2D[i][j];
        }
    }
    cout << calBeauty(a2D);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    solve();
}

https://codeforces.com/contest/313/problem/C

Test: #3, time: 0 ms., memory: 3780 KB, exit code: 0, checker exit code: 1, verdict: WRONG_ANSWER
Input
16
978618343 473608041 799158564 800910753 461479363 520477481 780529176 678879534 118274424 720632652 639921017 582019792 143353286 537373229 944668919 758615621

Output
14361969205
Answer
14440495117

Checker Log
wrong answer expected '14440495117', found '14361969205'


Sao làm mãi mà cứ sai bài này nhỉ, tính ra giấy cộng thử cũng ra 14361969205 mà=((
nó bắt arrange to get maximum chứ có bắt tính đâu ;);) biết chơi cái này mà cũng lươn lẹo gớm nhỉ ;);)
 
@_Gia_Cat_Luong_
Mình thấy cách này tối ưu hơn.
Python:
class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        nums.sort()
        if target < nums[0]:
            return 0
        #Init memo
        memo = [0] * (target+1)
        memo[0] = 1
       
        for i in range(nums[0], target + 1):
            memo[i] = sum(memo[i - x] for x in nums if i - x >= 0)
        return memo[target]

về cơ bản thì vẫn dùng memoization. Nhưng sẽ không bị lặp lại việc tính memoization. Do đó nó sẽ tối ưu hơn. Runtime: 40 ms, faster than 70.54% of Python3
Cái này là tabulation rồi chứ đâu còn là memoization nữa. Nhưng anyway, đã tối ưu hơn nhiều rồi. Cám ơn bạn đã chia sẻ nha, mong sau này bạn cứ tiếp tục đóng góp. Share lại bạn bài của mình sau khi update:

Python:
class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        nums.sort()
        self.nums = nums
        return self.countSum(target)
    
    @cache
    def countSum(self, target):
        if target <= 0:
            return 1 if target == 0 else 0
        count = 0
        for n in self.nums:
            if n > target:
                break
                
            count += self.countSum(target - n)
            
        return count
 
Cái này là tabulation rồi chứ đâu còn là memoization nữa. Nhưng anyway, đã tối ưu hơn nhiều rồi. Cám ơn bạn đã chia sẻ nha, mong sau này bạn cứ tiếp tục đóng góp. Share lại bạn bài của mình sau khi update:

Python:
class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        nums.sort()
        self.nums = nums
        return self.countSum(target)
   
    @cache
    def countSum(self, target):
        if target <= 0:
            return 1 if target == 0 else 0
        count = 0
        for n in self.nums:
            if n > target:
                break
               
            count += self.countSum(target - n)
           
        return count
Uhm, trước giờ t cứ nghĩ cả bottom-up, top-down thì đều là memoization. Giờ biết thêm khái niệm tabulation. Thanks!
 
IMG_20210730_162703.jpg

Trong đây các bác học cao hiểu rộng có thể hướng dẫn code bài này cho em được không ạ
 
Số lần CUM bằng số '('
Sau đó iterate từng pair "(" ")" để CUM OUT ra . check lỗi cú pháp thì check coi có đủ pair () ko có lỗi trong sử dụng operator ( +-*/ ) không
 
Ý tưởng sơ qua là dùng stack, duyệt chuỗi, gặp dấu ( thì push vô stack vị trí của (, gặp ) thì pop stack ra, xuất ra chuỗi từ vị trí của stack.top() tới vị trí hiện tại, nói thì dễ chứ code mà không dùng thư viện thì cũng dài đấy :amazed:
 
Thí chủ nhìn không ra solution hay gì ?
E không biết cách thực hiện cái ý tưởng của mình,
E nghĩ rằng mỗi "(" thì tạo 1 giá trị mở rồi nếu gặp ")" thì quay lại từng giá trị mở trước đó thì cắt xâu ra nếu như thoả mãn yêu cầu của 1biểu thức
 

Thống kê chủ đề

Ngày tạo
unknowpc90,
Người trả lời cuối
Spaghetti Code,
Trả lời
1.460
Lượt xem
154.141
Quay lại
Lên đầu trang