Tin học Việt

Would you like to react to this message? Create an account in a few clicks or log in to continue.
Tin học Việt

A place for learning and sharing knowledge

Latest topics

» [Đề thi] Đề thi HSG cấp thành phố lớp 12 đợt 1 môn Tin các năm
by camchung Sun Jul 26, 2015 10:49 am

» [Bài tập] Các bài tập quy hoạch động cơ bản
by popperdk Tue Apr 28, 2015 2:17 am

» [Unix/Linux] Lecture 2 - File Transfer and Working with Commands
by Admin Tue Apr 07, 2015 9:35 pm

» [Unix/Linux] Lecture 1 - Basic Command
by Admin Tue Apr 07, 2015 8:44 pm

» [Unix/Linux] Introduction To Unix/Linux
by Admin Tue Apr 07, 2015 8:17 pm

» [Thuật toán] Loang trên ma trận
by zoutsec Sat Feb 28, 2015 4:26 pm

» Thảo luận về stack!
by ganar27 Sat Jun 14, 2014 4:21 pm

» [Bài tập] Bài tập về đường đi ngắn nhất
by sonlv1112 Fri Feb 07, 2014 9:37 pm

» [Game học hóa] Căn nhà phù thủy
by Admin Sun Jan 26, 2014 8:32 pm

» [Game] Căn nhà phù thủy
by Admin Sun Jan 26, 2014 8:31 pm


    [Chuyên đề] Quy hoạch động (Nâng cao: Trạng thái - Vị trí - Cấu hình)

    avatar
    Admin
    Admin
    Admin


    Posts : 48
    Golds : 2147483646
    Liked : 18
    Ngày tham gia : 2011-08-25
    Tuổi : 27
    Đến từ : Ho Chi Minh City

    [Chuyên đề] Quy hoạch động (Nâng cao: Trạng thái - Vị trí - Cấu hình) Empty [Chuyên đề] Quy hoạch động (Nâng cao: Trạng thái - Vị trí - Cấu hình)

    Post by Admin Sun Jan 27, 2013 10:11 am

    DP BITMARK 1: (DP trạng thái)
    Là 1 phương pháp :
    Giải quyết tốt nhiều bài toán yêu cầu sử lý nhiều lớp về trạng thái
    ứng dụng khá quan trọng trong nhiều bài toán có dữ liệu có thể đua về xử lí bằng bit
    là 1 pp khá hay, có thể thay thế 1 số bài toán về pp nhánh cận
    cũng có thể nói rằng, dp bitmask là 1 cách vét thông minh và có độ chính xác cao.
    Trong pp này, ta cần lưu ý :
    Các bài toán con được lưu trong 1 mảng, gọi là bảng trạng thái. Trạng thái hiện tại sẽ cập nhật dữ liệu của trạng thái trước.
    Phải biết cập nhật tất cả các trạng thái trước.
    Ví dụ : 00000110011000 sẽ là bài toán trước của 00000110011010
    Sử dụng pp về xử lý bit để giải quyết.
    Có thể giải nhiều bài toán về phép đếm với cấu hình nhỏ.
    Phân loại : có 2 loại chính :
    Loại thứ 1 : là loại mà cấu hình vị trí của giá trị hok bị thay đổi – tức là cách chọn cố định
    Loại thứ 2 : là loại mà phụ thuôc vào cách xếp thứ tự giá trị để bài toán tối ưu
    Thông thường, bảng sẽ xây dựng được như sau :
    F[x] – chỉ lưu giá trị tại trạng thái x – chủ yếu dùng là cho loại 1
    F[x,I] – lưu giá trị tại trạng thái x với I nạp vô sau cùng
    Ví dụ : cho n phần tử, tìm k phần tử sao cho tổng k phần tử bé hơn số C cho trước
    Giải : Theo pp như trên đã trình bày, thì ta sẽ xây dựng bài toán từ các trạng thái trước cho nên công thức là : f[x] := f[x’] + a[i] (với x’ là trạng thái trước của k, khi thêm giá trị a[i] vào (tức là trạng thái bit I – 1 của x’ là 1) thì ta có dc trạng thái x). ta tính cho tới khi x = 1 shl n – 1 (tức là xét tất cả n phần tử)
    Problem :
    QBSELECT vn.spoj.pl/problems/QBSELECT/
    QBGAME vn.spoj.pl/problems/QBGAME/
    LEM3 vn.spoj.pl/problems/LEM3/
    MIXUP2 vn.spoj.pl/problems/MIXUP2/
    COWGIRL vn.spoj.pl/problems/COWGIRL/

    DP VỊ TRÍ – CẤU HÌNH :
    Đây là 1 dạng bài toán thường yêu cầu giải quyết 2 bài toán sau :
    Bài toán 1 : cho vị trí k , hãy ghi ra cấu hình tại vị trí k ấy
    Bài toán 2 : cho 1 cấu hình, hãy ghi ra vị trí k mà cấu hình ấy đạt được
    Pp làm chính như sau :
    Thông thường phần khởi tạo, ta sẽ gán vào mảng cấu hình cao nhất khi đạt tới vị trí ấy
    Vào phần dp , ta giải quyết 2 vấn đề trên bằng cách :
    Bài toán 1 : ta thu hẹp từ điển cấu hình (tức là bỏ hết những cấu hình nằm trước cấu hình k) , dồng thời cập nhật lại vị trí cấu hình k khi loại bỏ các cấu hình trước nó.
    Bài toán 2 : ta tìm số lượng các cấu hình nằm trước cấu hình cần tìm, từ đó suy ra vị trí của cấu hình đang xét
    Ví dụ:
    Cho 1 tập từ điển gồm các dãy nhị phân có n phần tử, yêu cầu :
    Tìm vị trí của 1 cấu hình cho trước
    Cho vị trí, tìm cấu hình tại vị trí ấy
    Với bài này , ta làm như sau :
    Phần init, theo pp làm thì ta phải đếm số cấu hình cao nhất tại vị trí k, nên tại vị trí k có cấu hình là f[k] := 2^k
    F[0] := 1;
    For I := 1 to n do f[i] := 2*f[I – 1];

    Yêu cầu 1 : ta sẽ đếm những cấu hình đứng trước cấu hình k đang xét. Những cấu hình cần đếm là những cấu hình mà nhỏ hơn k
    Ví dụ :
    xxxxxxxx1xxxxxxxx : cấu hình của k
    xxxxxxxx0xxxxxxxx : tại vị trí đang xét
    Do đó phải có f[I – 1] cấu hình nhỏ hơn vị trí I đang xét
    Sau khi đếm xong số lượng cái dãy nhị phân bé hơn k, ta phải + 1
    For I := 1 to n do
    If s[i] = 1 then res := res + f[I – 1];

    Yêu cầu 2 : cách lập luận giống như yêu cầu 1, đồng thời phải cập nhật lại cho vị trí k có vị trí mới :
    Code:

    For I := 1 to n do
      If k >= f[n – i] then c[i] := 0
      Else
        Begin
          C[i] := 1;
          K := k – f[n – i];
        End;
    For I := 1 to n do writeln(c[i]);

    Problem :
    SHHV vn.spoj.pl/problems/SHHV/
    SHTH vn.spoj.pl/problems/SHTH/
    CATALAN vn.spoj.pl/problems/CATALAN/

      Current date/time is Sat May 11, 2024 3:06 pm