BK Algorithm Club
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.


BK Algorithm Practice Forum
 
Trang ChínhTrang Chính  Latest imagesLatest images  Tìm kiếmTìm kiếm  Đăng kýĐăng ký  Đăng NhậpĐăng Nhập  

 

 Dynamic Programming: From novice to advanced

Go down 
3 posters
Tác giảThông điệp
intellhave
dzô THCS
dzô THCS
intellhave


Tổng số bài gửi : 57
Join date : 25/11/2008

Dynamic Programming: From novice to advanced Empty
Bài gửiTiêu đề: Dynamic Programming: From novice to advanced   Dynamic Programming: From novice to advanced I_icon_minitime25.11.08 23:47

Đây là một bài viết trên TopCoder nói về quy hoạch động khá hay, các bạn có thể tham khảo
tại đây
Về Đầu Trang Go down
Softwareboy
cháu lên 3
cháu lên 3



Tổng số bài gửi : 1
Join date : 26/11/2008

Dynamic Programming: From novice to advanced Empty
Bài gửiTiêu đề: Re: Dynamic Programming: From novice to advanced   Dynamic Programming: From novice to advanced I_icon_minitime30.11.08 23:28

Ở đây có nhiều bài quy hoạch động lắm nè. Em dở quy hoạch động quá, ai chỉ em với Sad. http://www.diendantinhoc.com/index.php?showtopic=99969
Về Đầu Trang Go down
intellhave
dzô THCS
dzô THCS
intellhave


Tổng số bài gửi : 57
Join date : 25/11/2008

Dynamic Programming: From novice to advanced Empty
Bài gửiTiêu đề: Re: Dynamic Programming: From novice to advanced   Dynamic Programming: From novice to advanced I_icon_minitime30.11.08 23:38

Haha, trong đề thi ACM vừa rồi có tới 2 bài QHĐ luôn Smile
Về Đầu Trang Go down
ldt
dzào năm I
ldt


Tổng số bài gửi : 109
Join date : 25/11/2008

Dynamic Programming: From novice to advanced Empty
Bài gửiTiêu đề: Re: Dynamic Programming: From novice to advanced   Dynamic Programming: From novice to advanced I_icon_minitime01.12.08 15:11

Softwareboy đã viết:
Ở đây có nhiều bài quy hoạch động lắm nè. Em dở quy hoạch động quá, ai chỉ em với Sad. http://www.diendantinhoc.com/index.php?showtopic=99969
em phải hỏi bài nào chứ, nói không như vậy ai biết đâu mà giúp
Trong trang của DDTH thì toàn là các bài QHĐ cơ bản, đã được đề cập trong sách "một số vấn đề chọn lọc trong môn tin học" của thầy Nguyễng Xuân My. em có thể tìm mua hoặc liên hệ anh cho mượn.
(trong đó các bài từ khoảng 15 trở đi khá hay, các bài đầu quá đơn giản)
Về Đầu Trang Go down
intellhave
dzô THCS
dzô THCS
intellhave


Tổng số bài gửi : 57
Join date : 25/11/2008

Dynamic Programming: From novice to advanced Empty
Bài gửiTiêu đề: Re: Dynamic Programming: From novice to advanced   Dynamic Programming: From novice to advanced I_icon_minitime01.12.08 23:01

Các bài cơ bản thì có thể tìm thấy trong rất nhiều tài liệu. Quan trọng là làm sao biết cách áp dụng các bài cơ bản vào trong các bài mình gặp. Điều này không dễ chút nào! Ví dụ bài BACKPACK chẳng hạn Sad
Về Đầu Trang Go down
ldt
dzào năm I
ldt


Tổng số bài gửi : 109
Join date : 25/11/2008

Dynamic Programming: From novice to advanced Empty
Bài gửiTiêu đề: Re: Dynamic Programming: From novice to advanced   Dynamic Programming: From novice to advanced I_icon_minitime02.12.08 2:49

các em cứ làm từ từ, từ dễ đến khó, lâu dần thành 1 kỹ năng khi nhìn vào các bài QHĐ. 30 bài trong sách của thầy NXM là 1 cách hay để học. Đọc hết nhanh chắc vài ngày, chậm thì khoảng 1tháng (1 ngày/bài)

ok, trước tiên là code, mọi người đọc thu xem:
Code:
/*
  Name: 2008. Dab of Backpack
  Copyright: Tiger
  Author: LDT
  Date: 02/12/08 02:46
  Description:
    - http://www.spoj.pl/problems/BACKPACK/
*/
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

const int maxn  = 100;
const int maxV  = 3210;

int n;
int v[maxn];
int c[maxn];
int phu[maxn];
int tich[maxn];
int dsphu[maxn][3];
int nphu[maxn];
int vMax;
int ll[maxn][maxV];
ifstream fi("input.txt");

void readf(){
    cin >>vMax >> n ;
    vMax /= 10;

    //cout <<" n = " <<n <<" vMax = " <<vMax <<endl;
    for (int i=1; i<=n; i++)
    {
        cin >> v[i] >>c[i] >>phu[i];
        tich[i] = v[i]*c[i];
        v[i] /= 10;
    }

}

void init(){
    for (int i = 1; i<=n; i++)
    {
        if (phu[i] > 0)
        {
            int p = phu[i];
            dsphu[p][nphu[p]] = i;
            nphu[p]++;
              //cout <<" i = " <<i <<" phu[i] = " <<phu[i] <<" nphu[p] = " <<nphu[p] <<" dsphu[p][nphu[p]] = "
            //    <<dsphu[p][nphu[p]-1]  <<endl;
        }                 
    }

}

int Max(int a ,int b){
    if (a > b)
        return a;
    else
        return b;
}

void solve()
{
    //cout <<"solve" <<endl;
    for (int i = 1; i<=n; i++)
    {
        ll[i][0] = 0;
    }
    for (int i = 1; i<=vMax; i++)
    {
        ll[0][i] = 0;
    }

    //cout <<"loop" <<endl;

    for (int j = 1; j<=vMax; j++)
    {
        for (int i = 1; i<=n; i++)
        {
            ll[i][j] = ll[i-1][j];
            if ((v[i] <= j) && (phu[i] == 0))
            {
                //NOTE: Moi mon hang lay 1 lan

                // khong lay phu
                int layi = v[i]*c[i]*10;
                ll[i][j] = Max(ll[i][j],ll[i-1][j-v[i]]+tich[i]);

                if (nphu[i] == 1){
                    //lay phu 1 mon hang
                    int csphu1 = dsphu[i][0];
                    int lay1 = v[csphu1]*c[csphu1]*10;
                    if (v[i]+v[csphu1] <= j)
                        ll[i][j] = Max(ll[i][j],ll[i-1][j-v[i]-v[csphu1]] + tich[i] + tich[csphu1]);
                }

                if (nphu[i] == 2){
                    int csphu1 = dsphu[i][0];
                    int csphu2 = dsphu[i][1];

                    //lay phu 1 mon hang
                    if (v[i]+v[csphu1] <= j)
                        ll[i][j] = Max(ll[i][j],ll[i-1][j-v[i]-v[csphu1]] + tich[i] + tich[csphu1]);
                    if (v[i]+v[csphu2] <= j)
                        ll[i][j] = Max(ll[i][j],ll[i-1][j-v[i]-v[csphu2]] + tich[i] + tich[csphu2]);

                    //lay ca 2 mon hang phu
                    if (v[i]+v[csphu1] + v[csphu2] <= j)
                        ll[i][j] = Max(ll[i][j],ll[i-1][j-v[i]-v[csphu1]-v[csphu2]] + tich[i] + tich[csphu1] + tich[csphu2]);
                }

            }
        }
    }
}

int main()
{
    int sotest;
    cin >> sotest;
    for (int i = 1; i<=sotest; i++)
    {
        //cout<<"* test " <<i <<endl;
        memset(ll,0,sizeof(ll));
        memset(dsphu,0,sizeof(dsphu));
        memset(nphu,0,sizeof(nphu));
        memset(v,0,sizeof(v));
        memset(c,0,sizeof(c));
        memset(phu,0,sizeof(phu));
        memset(tich,0,sizeof(tich));
        readf();
        init();
        solve();
        cout <<ll[n][vMax] <<endl;
    }
    return EXIT_SUCCESS;
}
Về Đầu Trang Go down
Sponsored content





Dynamic Programming: From novice to advanced Empty
Bài gửiTiêu đề: Re: Dynamic Programming: From novice to advanced   Dynamic Programming: From novice to advanced I_icon_minitime

Về Đầu Trang Go down
 
Dynamic Programming: From novice to advanced
Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
BK Algorithm Club :: Thuật toán :: Quy hoạch động-
Chuyển đến