#1. Thuật Toán Quy Hoạch Động - Bài Toán Dãy Con Tăng Dài Nhất ( LIS)

Поделиться
HTML-код
  • Опубликовано: 31 янв 2025

Комментарии • 124

  • @28tech_
    @28tech_  2 года назад +22

    Practice problem :
    codeforces.com/problemsets/acmsguru/problem/99999/521
    cses.fi/problemset/task/1145
    leetcode.com/problems/longest-increasing-subsequence/
    leetcode.com/problems/number-of-longest-increasing-subsequence/

    • @skhuyen6096
      @skhuyen6096 2 года назад +1

      link hackerrank nx a oi

  • @ngabcasolution5722
    @ngabcasolution5722 2 года назад +4

    Cảm ơn tác giả. rất hữu ích cho các bạn học sinh, sinh viên. Luôn ủng hộ kênh và chia sẻ cho các học trò

    • @28tech_
      @28tech_  2 года назад

      Em cảm ơn ạ

  • @namlequang4290
    @namlequang4290 2 года назад +6

    Dễ hiểu lắm Anh, hóng phần tiếp theo. Xem các video khác vẫn chưa thông suốt lắm.

    • @28tech_
      @28tech_  2 года назад +1

      ok cố gắng lên em :D

  • @vietvuong9830
    @vietvuong9830 2 года назад +6

    Rất cảm ơn bạn nhé! Hướng dẫn của bạn có ý nghĩa với rất nhiều người. Góp ý nho nhỏ cho video sẽ tốt hơn đó là bạn hạn chế hơn việc nói đế OK vào cuối các câu nói nhé! Thói quen sẽ khó sửa nhưng làm được mà. Trân trọng!

  • @trungthanhbp
    @trungthanhbp 2 года назад +1

    có add thêm cái link ở dưới description rất là hữu ích :D

  • @trungkiet2020
    @trungkiet2020 2 года назад +8

    Hay quá anh ơi, đúng cái em đang cần, ủng hộ series này 100% 😁😁

  • @htuanqn
    @htuanqn Год назад

    quá hay a ơi, e thấy chuyên đề về QHD dc nhiều người săn đón ở kênh a

  • @vietvuong9830
    @vietvuong9830 2 года назад +8

    Mình đóng góp code Python cho bạn nào cần thì tham khảo nhé:
    fi = open('lis.inp','r')
    fo = open('lis.out','w')
    n = int(fi.readline())
    x = fi.readline().split()
    A = [int(i) for i in x]
    L = [1 for i in range(n)]
    res = 1
    for i in range(1,n):
    for j in range(0,i):
    if A[i] > A[j]:
    L[i] = max(L[i],L[j]+1)
    if L[i] > res: res = L[i]
    fo.write(str(res))
    fi.close()
    fo.close()

    • @kiennguyen-th2tg
      @kiennguyen-th2tg Год назад

      n=[int(i) for i in input().split()]
      s=[1]*len(n)
      for i in range (1,len(n)):
      for k in range (i):
      if n[i]>n[k]:
      s[i]=max(s[i],s[k]+1)
      print(max(s))
      tui ngắn hơn ông nè hehe

    • @luisdato1712
      @luisdato1712 Год назад

      @@kiennguyen-th2tg Mình cũng code giống bạn nhưng khi thử bộ test 11 số [1,2,3,8,9,4,5,6,20,9,10] thì ra kết quả là 7 trong khi đáp án chính xác phải là 8 [1,2,3,4,5,6,9,10]. thật kì lạ

  • @bldouyin4145
    @bldouyin4145 2 года назад +6

    anh giảng rất hay nhưng rất tiếc em não ngắn, sau 1 hồi xem lại thì cuối cùng cũng hiểu bài dãy con tăng hđ ntn rồi:3 cảm ơn anh ạ

    • @vietvuong9830
      @vietvuong9830 2 года назад +1

      Riết rồi cũng hiểu cố lên em!

  • @tranquy2547
    @tranquy2547 2 года назад

    hay quá anh ơi, cuối cùng cũng tới phần em đau đầu nhất, ủng hộ anh

  • @KietNguyen-ee7hv
    @KietNguyen-ee7hv 2 года назад +1

    em ủng hộ series này ạ 😚

  • @HungNguyen-ur4dg
    @HungNguyen-ur4dg Год назад

    quá tốt luôn..cảm ơn anh đã làm em thông suốt

  • @hoangphuc899
    @hoangphuc899 2 года назад +1

    cảm ơn, anh dạy kỹ lắm ạ!

  • @traninhtheanh6138
    @traninhtheanh6138 2 года назад

    Hay quá anh lộc ơi. Em thích các video về qhđ lắm ạ

    • @28tech_
      @28tech_  2 года назад

      Ok chúc em học tốt.

  • @jitan5429
    @jitan5429 Год назад +3

    a ơi cho e hỏi là các công thức của quy hoạch động như này , a làm như nào để nghĩ ra các công thức như này vậy a ? cám ơn a nhiều

  • @khoaptit
    @khoaptit Год назад +1

    Học anh nhiều quá em bị nhiễm chữ ok vào cuối câu nói rồi ạ huhu
    Hôm trước cô gọi lên giải thích code mà em ok với cô liên tục ạ :)))

  • @khangnguyenviet
    @khangnguyenviet 2 года назад

    đây dồi đây dồi =)) chúc a sức phẻ để ra nhiều phần về qhđ nữa nhen

  • @hanguyentrong8779
    @hanguyentrong8779 2 года назад

    chờ a mãi cuối cùng a cũng ra phần quy hoạch động

    • @28tech_
      @28tech_  2 года назад

      giờ lo cơm áo gạo tiền thành ra thời gian ko có rảnh như tầm năm ngoái em ạ.

    • @hanguyentrong8779
      @hanguyentrong8779 2 года назад

      @@28tech_ Video a ra chậm nhưng mà chất lượng anh ạ
      vẫn ủng hộ a dài dài

  • @plee0577
    @plee0577 2 года назад

    hóng mãi, quá đỉnh a ơi :33

  • @namquach73
    @namquach73 2 года назад

    dễ hiểu, tận tình, duyệt

  • @sonvuinh2366
    @sonvuinh2366 2 года назад

    quá chất lượng, cảm ơn bạn

  • @thanhha5251
    @thanhha5251 Год назад

    hay qua di em hieu quy hoach dong luon r

  • @nguyennhunghp
    @nguyennhunghp Год назад +3

    Add cho em xin link LIS độ phức tạp O(nlogn) và có in dãy với ạ. Tks add nhiều

  • @leminhhai5721
    @leminhhai5721 2 года назад

    video của anh dễ hiểu quá 😁

    • @28tech_
      @28tech_  2 года назад

      Thank em 🤟🤟🤟

  • @Lunguyen08
    @Lunguyen08 Год назад +2

    Hồi lớp 8 cô dạy để thi hsg tin bài này mà ko hiểu chi hết, bây giờ lên lớp 10 nghe anh giảng mới thông😂😂😂, mà cho em hỏi cài đặt lis vs độ phức tạp là O(nlogn) là video nào vậy anh😢😢😢

    • @zapdown6116
      @zapdown6116 Год назад

      hh trùng hợp v, hồi lp9 mình cx hc thuộc mấy bài qhd này vào phòng thi😂😂😂

  • @NinWuy
    @NinWuy 2 года назад +1

    Hay quá cuối cùng có series huyền thoại này :)

    • @28tech_
      @28tech_  2 года назад +2

      OK em bắt đầu thôi.

  • @truongtaman5663
    @truongtaman5663 2 года назад

    Cuối cùng cũng có bài toán về qhđ!

  • @phamtuananh2378
    @phamtuananh2378 2 года назад +5

    a ơi sắp có vid về cách thứ hai có độ phức tạp O(nlogn) chưa ạ

  • @BDCCN-NguyenVanTuan
    @BDCCN-NguyenVanTuan 2 года назад +2

    a có thể làm video hướng dẫn cách chung để giải quyết mấy bài quy hoạch động này đc k ạ

    • @28tech_
      @28tech_  2 года назад +1

      Phương pháp ấy hả hehe.

  • @KaiChuKo485
    @KaiChuKo485 Год назад

    Anh lên video về cách thứ hai
    có độ phức tạp là O(nlogn) đi ạ

  • @decon.
    @decon. 11 месяцев назад

    anh ơi có video lý thuyết về thuật toán quy hoạch động không ạ

  • @vuongthikimhuyen1992
    @vuongthikimhuyen1992 10 месяцев назад

    Ra video truy vết đi ad ơi. Cảm ơn rất nhiều ạ

  • @khavovan8201
    @khavovan8201 2 года назад

    Sắp 10k rùi anh ơi🥰🥰🥰🥰

    • @28tech_
      @28tech_  2 года назад +1

      Haha, hồi em sub nó mới được có 80 90 sub.

    • @khavovan8201
      @khavovan8201 2 года назад

      @@28tech_ fan cứng mà anh hehe

  • @ucphu6269
    @ucphu6269 2 года назад +1

    Anh hướng dẫn xuất ra dãy đó luôn được không ạ

  • @ngocthaovu
    @ngocthaovu 9 месяцев назад

    video hay quá ạ

    • @28tech_
      @28tech_  9 месяцев назад +1

      Cảm ơn em chúc em học tốt nhé

    • @ngocthaovu
      @ngocthaovu 9 месяцев назад

      @@28tech_ mong anh ra nhiều video hơn nữa ạ

  • @youaresocute2002
    @youaresocute2002 2 года назад

    cuối cùng cũng có quy hoạch động rồi hehe

  • @animekay3405
    @animekay3405 2 месяца назад

    Này o(n)^2 hả a có ý tưởng nào dưới nó k ạ

  • @hatrinh6432
    @hatrinh6432 2 года назад

    dãy con tăng dài nhất chưa có video về truy vết và phần cải tiến ah add

  • @thanhbinhnguyen5943
    @thanhbinhnguyen5943 2 года назад

    quá hay anh ơi ~~~~

    • @28tech_
      @28tech_  2 года назад

      🤪🤪🤪🤪

  • @mitvuong1856
    @mitvuong1856 Год назад +1

    sắp có bài lis nlogn chưa a

    • @28tech_
      @28tech_  Год назад

      Chưa có em ạ

  • @tinnhiem8527
    @tinnhiem8527 2 года назад +1

    ra thêm các bài tập CTDL stack queue đi anh

    • @28tech_
      @28tech_  2 года назад +1

      Thế thì vô vàn lắm hehe.

  • @DaThuFlorida
    @DaThuFlorida 7 месяцев назад

    Đi thi xài auto, themis có chấm không anh.

  • @NguyễnLong-o1t
    @NguyễnLong-o1t 8 месяцев назад

    em cảm ơn anh

  • @miningcraft897
    @miningcraft897 2 месяца назад

    Anh ơi cho em xin cái bài mà anh làm trong video ấy, ở hackkerrank hay sao ấy ạ

    • @28tech_
      @28tech_  2 месяца назад +1

      Này Ko còn rồi bạn ạ

    • @miningcraft897
      @miningcraft897 2 месяца назад

      @@28tech_ Dạ vâng ạ

    • @miningcraft897
      @miningcraft897 2 месяца назад

      @@28tech_ Vậy còn mấy bài nào liên quan cũng trên hackerrank ko ạ?

  • @VanThanh-cb8uk
    @VanThanh-cb8uk Год назад

    3 năm trước có video này thì zui r :vv

  • @xienkhum9980
    @xienkhum9980 Год назад

    Anh có vid cải tiến thuật toán chưa ạ

  • @catorlife
    @catorlife 11 месяцев назад

    cho e hỏi trong CP thì nên xài mảng bình thường hay vector vậy a?

    • @28tech_
      @28tech_  11 месяцев назад

      Em dùng cái nào cũng được, như nhau cả mà

  • @quyle2185
    @quyle2185 2 года назад

    Ok nha anh

  • @kienbuitrung7555
    @kienbuitrung7555 Год назад

    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    mấy cái dòng này là cái dòng gì vậy anh, em thấy ngta lập trình hay gắn như này nên em cx bắt chước theo chứ không thực sự biết tác dụng của nó là gì. Mong anh giải thích vs ạ, vs lại em không biết run code kiểu s khi có mấy dòng này nữa

    • @mitvuong1856
      @mitvuong1856 Год назад +1

      ios_base::sync_with_stdio(false);
      Dùng cin/cout bình thường sẽ bất lợi về thời gian do phải đồng bộ với stdin/stdout (vì lí do lịch sử nên phải có đồng bộ này). Gặp bài I/O nhiều phải có câu này, nếu I/O ít thì không đáng kể.
      cin.tie(0); để ngăn sự đồng bộ giữa cin và cout: chỉ khi cout xuất ra hết thì cin mới nhập vào (và ngược lại). Việc đồng bộ này chỉ có chương trình tương tác mới cần.

  • @funnymeme6981
    @funnymeme6981 2 года назад +1

    làm thế nào để in ra tất cả các dãy con không giảm vậy anh

  • @ahardworkingbee
    @ahardworkingbee 2 года назад

    Dễ quá bạn ei
    ^^

  • @iluminatibox9949
    @iluminatibox9949 Год назад +1

    thuật toán này là sliding window đúng không nhỉ?

  • @KienNguyen-mo3we
    @KienNguyen-mo3we 2 года назад

    tym đầu ạ

    • @28tech_
      @28tech_  2 года назад

      😁😁😁

  • @ĐứcNguyễn-t8j
    @ĐứcNguyễn-t8j Месяц назад

    anh sử dụng phần mềm code gì vậy ạ

  • @datgameon2656
    @datgameon2656 Год назад

    a ơi, cải tiến thuật toán đc ko a :))

  • @tintrung8372
    @tintrung8372 2 года назад +1

    làm sao để in ra dãy đó ạ

  • @truongtra1183
    @truongtra1183 2 года назад

    Nếu họ ko ra đề là 'dãy con liên tiếp ' thì mình tìm các phần tử cách nhau đúng ko ạ ?

  • @phamhonganh3708
    @phamhonganh3708 2 года назад

    anh cho em xin link bài này trên hackerrank đc ko ạ

  • @ucNguyen-iv8iu
    @ucNguyen-iv8iu 2 года назад

    anh ơi ra vid in dãy ra chưa ạ

  • @truongminhnhut4993
    @truongminhnhut4993 2 года назад

    Nếu mà làm dãy con giảm thì sao vậy ad

  • @nvnhuquynh4505
    @nvnhuquynh4505 Год назад

    có link nộp bài k ạ

  • @hoangdev2305
    @hoangdev2305 2 года назад

    với n = 10^5 thì có thuật toán nào tối ưu k ạ

    • @28tech_
      @28tech_  2 года назад +1

      Có em nhé có thể kết hợp binary search, đợi video sau nhé

  • @thuanmevan5683
    @thuanmevan5683 2 года назад +1

    Anh nói to hơn ạ, em mong anh

  • @tienato2042
    @tienato2042 Год назад

    có phần giải bài này cho java không ạ

    • @28tech_
      @28tech_  Год назад

      Jca em code tương tự thôi

  • @ducmih2203
    @ducmih2203 2 года назад

    bài này dùng lower_bound nhanh hơn anh ạ

  • @cuongnguyenmanh5251
    @cuongnguyenmanh5251 Год назад

    Làm sao để nó hiện tiếng Việt như thế kia vậy anh ơi?

  • @itnhalam
    @itnhalam 2 года назад

    anh ơi có phần giảm độ phức tạp của bài này chưa ạ

  • @AnNguyen-mf7zb
    @AnNguyen-mf7zb 7 месяцев назад

    ko có phần truy vết à anh

  • @nhndO_o
    @nhndO_o 2 года назад

    anh làm phần truy vết đi ạ

  • @thiemhoang3015
    @thiemhoang3015 2 года назад

    làm sao để in cả dãy ra vậy anh

  • @NMnhSon
    @NMnhSon 3 месяца назад

    viết code mà không chuyển unikey là sao??

    • @28tech_
      @28tech_  3 месяца назад

      @@NMnhSon nó là quyền của mình, bạn có quyền gì bảo mình phỉ chuyển hay ko?

  • @luukhai3886
    @luukhai3886 Год назад +1

    thay vì cho L[i] = max(L[i], L[j] + 1) thì sao mình không cho L[i]++ luôn nhỉ? cũng là xét a[i] > a[j] mà
    int main() {
    int n; cin >> n;
    vector arr(n);
    for (int i = 0; i < n; i++) cin >> arr[i];
    vector L(n,1);
    int max_val = 0;
    for (int i = 1; i arr[j]) L[i] ++;
    }
    max_val = max(max_val, L[i]);
    }
    cout

    • @IamNix
      @IamNix Год назад +1

      ChatGPT:
      The line L[i] = max(L[i], L[j] + 1) is used to update the length of the longest increasing subsequence that ends at index i. The reason for using max(L[i], L[j] + 1) instead of just L[j] + 1 is that there may be multiple increasing subsequences that could potentially end at index i, and we want to choose the one that results in the longest overall subsequence.
      Consider the following input array:
      Copy code
      3 4 1 5 2
      Initially, the array L is set to all ones:
      Copy code
      1 1 1 1 1
      When we process arr[2] (which is 1), we compare it to all previous elements in the array to see if it could be part of a longer increasing subsequence. In this case, it cannot be part of any increasing subsequence longer than 1, because it is smaller than all previous elements. So L[2] remains at 1.
      When we process arr[3] (which is 5), we compare it to all previous elements in the array to see if it could be part of a longer increasing subsequence. It is larger than arr[0], arr[1], and arr[2], so it can be part of a longer increasing subsequence. In this case, the longest increasing subsequence that ends at index 3 is {3, 4, 5}. To update L[3], we add 1 to the length of the longest increasing subsequence that ends at j=1 (which is {3, 4}), since arr[3] is larger than arr[1]. We get L[3] = L[1] + 1 = 2.
      When we process arr[4] (which is 2), we compare it to all previous elements in the array to see if it could be part of a longer increasing subsequence. It is smaller than arr[0], arr[1], arr[2], and arr[3], so it cannot be part of any increasing subsequence longer than 1. So L[4] remains at 1.
      The resulting L array is:
      Copy code
      1 1 1 2 1
      The length of the longest increasing subsequence is 2, which is correctly found by the algorithm.
      If we had used L[i] = L[j] + 1 instead of L[i] = max(L[i], L[j] + 1), we would have missed the longer subsequence {3, 4, 5} and incorrectly calculated the LIS to be 1.

    • @luukhai3886
      @luukhai3886 Год назад +1

      @@IamNix tóm lại giải thích bằng tiếng việt đi

    • @IamNix
      @IamNix Год назад +1

      @@luukhai3886 là bạn hiểu sai vấn đề. Nếu làm như vậy. Bạn luôn giả định phần tử áp chót luôn được chọn.

  • @kuripuri4670
    @kuripuri4670 2 года назад

    Mình chx hiểu tại sao L[i]=max(L[i],L[j]+1), ai đó vô thông não cái

  • @hoangduonghn
    @hoangduonghn 2 года назад

    trời ơi, cứ ô kê, ô kê, khó học quá

    • @28tech_
      @28tech_  2 года назад

      Oke em có thể sang kênh khác học nha

    • @hoangduonghn
      @hoangduonghn 2 года назад +1

      @@28tech_ Vầng anh
      Xin lỗi anh, em không có ý chê bài giảng cảu anh, vì em mới đang tập tành, đó có thể là do vấn đề tâm lý của em, việc lặp từ quá gây rối loạn tiếp thu, nhưng nó cũng là một vấn đề của anh

  • @evuongnguyen5281
    @evuongnguyen5281 Год назад

    khó hiểu quá

  • @anhung9351
    @anhung9351 2 года назад

    :)))

  • @nxsang1611
    @nxsang1611 11 месяцев назад

    Lsao để in dãy con đó ra v ạ