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
LIS pair có thể làm nlogn được đấy.
sort theo phần tử đầu (nếu strictly LIS thì break tie bằng sort decresase thằng thứ 2, còn loosely LIS thì increase thằng thứ 2), sau đó làm LIS trên thằng thứ 2

C++:
    int maxEnvelopes(vector<vector<int>>& envelopes) {
        auto n = envelopes.size();
        vector<pair<int,int>> v;
        v.reserve(n);
        for(auto& env:envelopes){
            v.emplace_back(env[0],env[1]);
        }
        sort(v.begin(),v.end(),[](const pair<int,int>& a,const pair<int,int>& b){
            return a.first == b.first ? a.second > b.second : a.first < b.first;
        });
        vector<int> lis;
        for(auto p:v){
            auto insert_pos = lower_bound(lis.begin(),lis.end(),p.second);
            if(insert_pos == lis.end()) lis.push_back(p.second);
            else *insert_pos = p.second;
        }
        return (int)lis.size();
    }
nhỡ sort theo phần tử thứ 2 ra kết quả tốt hơn thì sao
 
nhỡ sort theo phần tử thứ 2 ra kết quả tốt hơn thì sao
thế anh nói thế này thì đã ngâm code được bao lâu r ?
nghe câu đã k muốn giải thích :whistle: :whistle:
do swap phần tử các cặp thì đáp án k đổi nên sort theo thằng nào k quan trọng (tính đối xứng)
chứng minh tường tận thì giả sử sort theo thằng 2 cho ra 1 đáp án tốt hơn, thì sort theo thằng thứ nhất cũng sẽ detect được đáp án đó.
 
thế anh nói thế này thì đã ngâm code được bao lâu r ?
nghe câu đã k muốn giải thích :whistle: :whistle:
do swap phần tử các cặp thì đáp án k đổi nên sort theo thằng nào k quan trọng (tính đối xứng)
chứng minh tường tận thì giả sử sort theo thằng 2 cho ra 1 đáp án tốt hơn, thì sort theo thằng thứ nhất cũng sẽ detect được đáp án đó.
đấy fen phải giải thích mới hiểu được chứ, cái này mặc dù fen giải thích rùi tẹo tui vẫn phải nghĩ thêm 1 tiếng nữa chắc mới hiểu. Thấy lạ là ko ai hỏi thui
 
Cho dãy có n phần tử, Tìm LIS, bỏ các phần tử ra, tiếp tục tìm LIS, bỏ các phần tử ra, tiếp tục... đến khi loại bỏ hết các phần tử ban đầu ra.
được k cái LIS. Suy ra Longest Non Increase Sequences = k.

Cái này có tên gọi hay thuộc nhóm bổ đề nào không nhỉ mấy fen?
@clonemasteruwu @_Gia_Cat_Luong_ @thuyduong2007
Xin nhỗi chứ k hiểu fen đang nói gì luôn ?
Sao làm vậy lại suy ra đc Longest Non Increase Sequences = k ? Mà định nghĩa LNIS là gì v ? Chuỗi con giảm dài nhất (loosely) ?
 
Cho dãy có n phần tử, Tìm LIS, bỏ các phần tử ra, tiếp tục tìm LIS, bỏ các phần tử ra, tiếp tục... đến khi loại bỏ hết các phần tử ban đầu ra.
được k cái LIS. Suy ra Longest Non Increase Sequences = k.

Cái này có tên gọi hay thuộc nhóm bổ đề nào không nhỉ mấy fen?
@clonemasteruwu @_Gia_Cat_Luong_ @thuyduong2007
Cái này gọi là định lí Dilworth

https://en.wikipedia.org/wiki/Dilworth's_theorem
 
cái này là bài kinh điển cho 2D segment tree (ST với các ST ở các node) rồi.

gọi dp là độ dài của dãy tăng nhau to nhất tới pair i có (xi, yi) đang xét.

với mỗi pair (xi, yi), lấy max của ST trong đoạn (0,0) tới (xi - 1, yi - 1) rồi update (xi, yi) với giá trị đó + 1. muốn in ra thì truy vết lại.

vì giới hạn tới 10^9 nên phải thực hiện nén mảng (các quan hệ <, >, = vẫn giữ nguyên giữa các phần tử nhưng chiều dài của vùng thay đổi lại, vd 1 10^6 10^9 10^5 nén thành 1 3 4 2).

sau khi nén xong thì mỗi chiều vẫn còn cỡ 10^5, khá to nên phải cài đặt segment tree động ở các node để có thể có đủ bộ nhớ.


nên code LIS bth bằng segment tree 1D trước rồi chuyển đến bài này thì đơn giản hơn.
 
Thấy mấy bác toàn dùng C/C++ để giải mấy bài toán.
Tại do mấy bác thích như vậy hay là C/C++ có gì đó đặc biệt nên giải mấy bài thuật toán sẽ tốt hơn vậy ?
Chạy nhanh, sướng, phê
Fen biết cảm giác ấn F5 xong IDE nó ra kết quả trong tích tắc phê lòi
Chứ dùng JS, Python 5-10 giây mới ra kết quả thì mình sẽ sinh ra nghi vấn là liệu solution của mình đã ngon chưa
 
Bài này giải DP như nào vậy mn:
cho một mảng, và một giới hạn M, tìm số lượng tối thiểu số trong mảng để có tổng lớn nhất không vượt quá M.

ví dụ: Mảng = {4,5,7,10,12}, M = 20

thì có 4+5+10 =10 và 7 + 12 =19 nên chọn 7 và 12 vì số lượng số là 2, ít hơn.
 
@_Gia_Cat_Luong_ bảo tui học LIS đầu luyện DP nên tui tìm các bài về LIS, web ý nó ko có rank, ai biết nó ở mức nào trời @@
Hic, fen hiểu nhầm ý tuôi. Ý tui là thay vì LCS thì LIS đỡ hại não hơn. Nhưng mà dù xao thì phen thẩm đc cái LIS thì giỏi hơn tui rồi. Hồi đó tui mất cả tháng mới hiểu nổi con hàng này T_T.
 

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.147
Quay lại
Lên đầu trang