Tải bản đầy đủ (.pdf) (16 trang)

Tiểu luận quy hoạch động

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.96 MB, 16 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN TOÁN ỨNG DỤNG VÀ TIN HỌC




TIỂU LUẬN
ĐỀ TÀI:

QUY HOẠCH ĐỘNG

GIẢNG VIÊN: LÊ KIM THƯ

Họ và tên: Bùi Đức Hoàng
Mã sinh viên: 20206142
Mã lớp: 129846
Mã học phần: MI3010

Hà Nội, ngày 18 tháng 11 năm 2021


Mục lục
A. Tổng quan về quy hoạch động .......................................................................................... 2
1. Giới thiệu chung ............................................................................................................... 2
a) Khái niệm ...................................................................................................................... 2
b) Ưu điểm ......................................................................................................................... 2
c) Nhược điểm ................................................................................................................... 2
2. Thuật toán chia để trị ...................................................................................................... 3
3. Nguyên lý tối ưu của Bellman ......................................................................................... 4
4. Đặc điểm chung của phương pháp quy hoạch động..................................................... 4
5. Các bước giải bài toán tối ưu bằng quy hoạch động .................................................... 5


a) Các cách tiếp cận .......................................................................................................... 5
b) Các bước giải bài toán quy hoạch động ..................................................................... 6
B. Một số bài toán liên quan đến quy hoạch động kinh điển .............................................. 6
1. Bài tốn tính 𝒏! ................................................................................................................ 6
2. Triển khai nhị thức Newton (𝒂 + 𝒃)𝒏 ............................................................................ 7
3. Bài tốn xếp ba lơ ............................................................................................................. 9

4. Bài tốn tìm đường đi nhỏ nhất.................................................................................... 11
5. Bài tốn tìm dãy con chung dài nhất ........................................................................... 11
6. Bài tốn tìm dãy con đơn điệu tăng dài nhất không liên tiếp .................................... 13
C. Kết luận ............................................................................................................................. 15

Page | 1


A. Tổng quan về quy hoạch động
1. Giới thiệu chung
a) Khái niệm
Phương pháp quy hoạch động do nhà toán học
người Mĩ Richard Bellman (1920- 1984) phát
minh vào năm 1953. Trong ngành khoa học máy
tính, quy hoạch động ( Dynamic Programming) là
một phương pháp giảm thời gian chạy của các
thuật toán thể hiện các tính chất của các bài tốn
con gối nhau (overlapping subproblem) và cấu
trúc con tối ưu (optimal substructure). Đây là một
phương pháp rất hiệu quả để giải nhiều bài toán
tin học, đặc biệt là những bài toán tối ưu. Những
bài tốn này thường có nhiều nghiệm chấp nhận
được và mỗi nghiệm có một giá trị lớn nhất hoặc

nhỏ nhất (tối ưu). Hiện nay các bài thi trong các cuộc thi code, cuộc thi hackathon
đa số đều cần đến quy hoạch động. Tất nhiên vẫn có cách giải khác để giải bài tốn
đó. Nhưng vì các cuộc thi code có giới hạn về thời gian, cũng như bộ nhớ của
chương trình, nên một thuật tốn hiệu quả là cực kỳ cần thiết. Và trong các trường
hợp như vậy, quy hoạch động là một trong những thuật toán hết sức cần thiết và
quan trọng.
b) Ưu điểm
Quy hoạch động là ta giải các bài toán con đơn giản nhất của bài tốn mẹ. Sau
đó kết hợp chúng lại để tìm lời giải cho bài toán lớn lần lượt như thế cho tới khi
tìm được đáp án của bài tốn u cầu theo phương pháp quy nạp. Quy hoạch động
thể hiện được sức mạnh ở chỗ với mỗi bài toán con, bài toán nhỏ đã giải được đều
sẽ được lưu trữ lại và đem ra sử dụng khi cần. Do đó giúp ta tiết kiệm thời gian
giải.
c) Nhược điểm
Việc kết hợp các bài toán con thành bài toán lớn, hay chia bài tốn lớn thành
các bài tốn nhỏ là một cơng việc đòi hỏi sự nhanh nhạy và chặt chẽ trong lập
luận. Vì thế nó là một cơng việc hết sức khó khăn để tìm cơng thức truy hồi và đơi
khi đưa ta vào bế tắc. Hơn nữa, khi giải với phương pháp quy hoạch động, việc
xuất hiện số lượng bài toán con cần lưu trữ lớn là điều không thể tránh khỏi. Gây
Page | 2


ra hiện tượng tràn bộ nhớ, tốn rất nhiều bộ nhớ để lưu trữ, địi hỏi máy tính phải có
khối lượng bộ nhớ lớn.
2. Thuật tốn chia để trị
Hay cịn gọi là các bài toán con gối nhau. “ Chia để trị” là một trong những
phương pháp thông dụng nhất trong tin học. Trong thuật toán đệ quy, nguyên lý
chia để trị (devide and conquer) thường đóng vai trị cốt lõi trong việc thiết kế
thuật toán. Để giải một bài tốn lớn, ta chia nhỏ nó thành hữu hạn các “ bài toán
con độc lập”, giải quyết từng “ bài toán con" một cách riêng lẻ rồi tổ hợp dần lời

giải, liên kết lại chúng lại thành bài toán ban đầu.
Phương pháp chia để trị thường được áp dụng đối với những bài tốn lớn, có
thể chia nhỏ và mang bản chất bài tốn đệ quy. Q trình đệ quy lần lượt xếp dần
các bài toán con vào ngăn xếp bộ nhớ và thực hiện giải các bài toán con theo thứ
tự từ đơn giản nhất cho đến phức tạp, đến khi giải được bài toán mẹ ban đầu.
Quy hoạch động là một dạng đặc biệt của thuật toán chia để trị. Do đó quy
hoạch động có thể giải bằng đệ quy ( chia để trị) nhưng ngược lại thì chưa chắc.
Thuật toán chia để trị được cài đặt bằng đệ quy mà trong đó những bài tốn con sẽ
được giải nhiều lần, điều này dẫn đến làm tăng thời gian thực hiện chương trình.
Trong khi đó quy hoạch động tối ưu hơn ở chỗ thuật toán sẽ ghi lại kết quả các bài
toán con vào trong các biến ( thường là biến mảng) và sử dụng chúng khi cần thiết
mà khơng phải giải lại bài tốn con. Khi đó việc thực thi sẽ tốn ít thời gian hơn,
tăng tốc độ thực hiện chương trình, tuy nhiên việc sử dụng bộ nhớ có thể sẽ tốn tài
nguyên hơn.
Một số thuật tốn:
Ví dụ 1: Tính số hạng thứ N của dãy Fibonacci. Công thúc đệ quy của dãy
Fibonacci: F(1)=1, F(2)=1, F(N)=F(N-1) + F(N-2) với N > 2.
Lời giải( mã giả) :
Int Fibonacci (int N )
{
If (N=1) or (N=2) then F:=1
Else F:=F(N-1)+F(N-2)
}
Ví dụ 2: Tìm số Catalan thứ N biết Catalan là dãy số thoả mãn biểu thức:
Page | 3


𝑛−1
0
𝐶𝑛 = { ∑ 𝑖=0 𝐶𝑖 𝐶𝑛−𝑖−1


Mã giả:

𝑛ế𝑢
= 00
𝑛ế𝑢 𝑛
𝑛>

A[0]=1, A[1]=1;
For i:=1 to N+1 do{
For j:=0 to i do
A[i]+= A[j]*A[i-j-1];
}
Return A[N];
3. Nguyên lý tối ưu của Bellman
Nguyên lý tối ưu của Bellman là một nguyên lý thừa nhận mà không chứng
minh.
Ta biết rằng phương pháp quy hoạch động thường xuyên được dùng cho việc
giải các bài toán tối ưu, bài tốn u cầu tìm phương pháp tốt nhất trong các giải
pháp có thể tìm được. Và ngun lý tối ưu của Bellman chính là cơ sở cốt lõi cho
bài tốn quy hoạch động.
Nguyên lý tối ưu Bellman được phát biểu như sau: “Dãy tối ưu các quyết định
trong một quá trình quyết định nhiều giai đoạn có thuộc tính là dù trạng thái và
các quyết định ban đầu bất kể như thế nào, những quyết định còn lại phải tạo
thành một cách giải quyết tối ưu không phụ thuộc vào trạng thái được sinh ra từ
những quyết định ban đầu”.
Do đó khi ta muốn giải một bài tốn bằng phương pháp quy hoạch động.
Trong một vài bài toán đơn giản quy hoạch động có thể diễn ra trong một bước,
nhưng nếu bài tốn gồm nhiều bước thì hãy chắc rằng bài toán lớn phải được xây
dựng từ những “ bài toán con” một cách tối ưu, hay được xây dựng từ nghiệm tối

ưu của những “bài toán con” ở các bước trước, khi đó bài tốn lớn mới được giải
một cách tối ưu.
4. Đặc điểm chung của phương pháp quy hoạch động
Với phương pháp quy hoạch động, chúng ta bắt đầu từ việc giải hữu hạn
những bài toán con nhỏ nhất ( bài tốn cơ sở), từ đó từng bước tổng hợp, quy nạp
lại để giải những bài toán lớn hơn cho tới khi giải được bài toán lớn nhất ( bài toán
ban đầu).
Page | 4


Khi giải một bài toán theo phương pháp chia để trị, ta phải chia bài toán lớn
thành hữu hạn các bài toán con cùng kiểu nhỏ hơn và giải quyết lần lượt chúng
bằng giải thuật đệ quy. Khi đó, trên thực tế nhiều bài tốn con có kết quả trung
gian giống nhau phải nhưng vẫn phải tính lại nhiều lần, dẫn tới việc lãng phí tài
nguyên bộ nhớ và làm chậm tốc độ chạy.
Đối với phương pháp quy hoạch động, để tối ưu bài tốn và tránh việc phải
tính tốn lại một số kết quả trùng lặp gặp lại nhiều lần, hoặc các kết quả trung gian
giống nhau. Ta thường xây dựng 1 bảng phương án dùng cho việc lưu trữ các kết
quả đã tìm được. Mảng này thường là một mảng N chiều và được tính tốn theo
cơng thức quy hoạch ta đã tìm được.
Việc áp dụng bảng phương án đã khiến quy hoạch động tối ưu hơn rất nhiều,
giảm thiếu các q trình tính tốn, và thể hiện sức mạnh của thuật toán quy hoạch
động so với các thuật tốn khác. Làm nổi bật lên ngun lí chia để trị.
Thường thì khơng có bài tốn hay dấu hiệu nhận biết nào cho ta biết khi nào
phải dùng phương pháp quy hoạch động nhưng nếu bài tốn đó thể hiện tính chất
của các bài tốn con gối nhau hay có cấu trúc tối ưu thì đó là lúc chúng ta nên
dùng tới phương pháp quy hoạch động.

5. Các bước giải bài toán tối ưu bằng quy hoạch động
a) Các cách tiếp cận

Bài toán quy hoạch động thường được dùng một trong hai cách tiếp cận sau:
• Top – down ( Từ trên xuống): Trong cách tiếp cận này ta sẽ chia bài
toán lớn thành các bài toán con, và giải quyết chúng lần lượt. Bất cứ
khi nào giải quyết xong một bài toán con, chúng ta sẽ lưu kết quả vào
bộ nhớ để tránh việc phải giải quyết lại nếu như bài tốn con đó được
gọi lại nhiều lần. Đây là đệ quy và lưu trữ được kết hợp với nhau.
• Bottom-up ( Từ dưới lên): Trong cách tiếp cận này, ta sẽ giải quyết vấn
đề theo hướng từ dưới lên. Tất cả các bài tốn con có thể cần đến đều
được giải trước, sau đó sẽ được dùng để xây dựng lời giải cho các bài
toán lớn hơn. Thường được thực hiện bằng cách lưu kết quả vào một
mảng N chiều. Cách tiếp cận này hơi tốt hơn về không gian bộ nhớ
dùng cho ngăn xếp và số lời gọi hàm. Tuy nhiên, đôi khi việc xác định

Page | 5


tất cả các bài toán con cần thiết cho việc giải quyết bài tốn cho trước
khơng được trực giác lắm.
b) Các bước giải bài tốn quy hoạch động
• Bước 1: Lập công thức truy hồi
Dựa vào nguyên lý tối ưu, ta chia bài tốn thành từng giai đoạn,
tìm cách phân rã bài toán thành hữu hạn các “ bài toán con” tương tự
có kích thước nhỏ hơn, tìm hệ thức quan hệ giữa kết quả của bài tốn
có kích thước đã cho với kết quả của các “ bài toán con” cùng kiểu có
kích thước nhỏ hơn.
• Bước 2: Tổ chức dữ liệu và chương trình cho bài tốn
Ta tổ chức dữ liệu dựa trên các yêu cầu sau:
✓ Dữ liệu được tính tốn dần theo các bước.
✓ Dư liệu được lưu trữ vào bảng phương án để giảm lượng
tính tốn lặp lại.

Các giá trị sau khi tính tốn thường được lưu trữ trong các mảng
N chiều một cách có thứ tự giúp cho việc tính tốn, truy cập có thể tiến
hành một cách thuận lợi và khoa học.
• Bước 3: Truy vết, tìm nghiệm của bài tốn dựa vào bảng phương án
Dựa vào bảng phương án đã có sau khi giải, ta tìm kết quả tối ưu
của bài tốn.
Sau khi đã tìm được nghiệm tối ưu của bài tốn. Để bài toán cho
ra hiệu suất tốt nhất, giảm thiểu quy trình, tiết kiệm thời gian và bộ
nhớ, ta tìm cách phát triển thuật bằng cách thu gọn hệ thức truy hồi
hoặc cung cấp các thuật toán.

B. Một số bài toán liên quan đến quy hoạch động kinh điển
1. Bài tốn tính 𝒏!

Bài tốn: Hãy tính giá trị của 𝑛! khi biết giá trị của n.
Input: Số nguyên dương n
Output: Giá trị của 𝑛!

Phân tích bài tốn:

Page | 6


1
, 𝑛=0
Ta có định nghĩa như sau 𝑛! = { 𝑛 ∗ (𝑛 − 1)! , 𝑛 > 0
Như vậy để tính được 𝑛! ta tính (𝑛 − 1)! Sau đó ghi nhớ và áp dụng cho các

vịng lặp sau đến giá trị 0.
Thuật toán:


Gọi GT[n] là giá trị của 𝑛!

Ta có cơng thức quy hoạch động như sau: GT[n] := n*GT[n-1];
Như vậy việc tính 𝑛! sẽ được thực hiện vòng lặp:
GT[0]:=1;

For i:=1 to n do
GT[i]:= i*GT[i-1];

Kết quả: Giá trị của 𝑛! là giá trị nằm trong phần tử GT[n].
2. Triển khai nhị thức Newton (𝒂 + 𝒃)𝒏

Bài toán: Hãy triển khai nhị thức Newton (𝑎 + 𝑏)𝑛 khi biết giá trị của n.
(Tìm các hệ số trong khai triển).
Input: số nguyên dương n.

Output: nhị thức (𝑎 + 𝑏)𝑛 đã được triển khai
Ví dụ: với n=2;

(𝑎 + 𝑏)2 = 𝑎2 + 2𝑎𝑏 + 𝑏2
Phân tích bài tốn:

Nhị thức Newton được triển khai theo công thức như sau:
Với 𝐶𝑛𝑘 =

(𝑎 + 𝑏)𝑛 = ∑

𝑛
𝐶 𝑘 𝑎𝑘 𝑏𝑛−𝑘

𝑘=0 𝑛

𝑛(𝑛−1)(𝑛−2)….(𝑛−𝑘+1)
𝑘!

=

𝑛!

𝑘!(𝑛−𝑘)!

Như vậy muốn triển khai được nhị thức Newton ta phải tính được 𝐶𝑛𝑘 với 0≤
𝑘 ≤ 𝑛.
Ta có cơng thức tính tổ hợp chập k của n:

Page | 7


𝑘
𝐶𝑛𝑘 = { 𝐶1𝑘−1 + 𝐶𝑛−1
𝑛−1

𝑘 = 0; 𝑘 = 𝑛
1≤ 𝑘 ≤ 𝑛−1

• Ta xây dựng một bảng C gồm n+1 dòng và n+1 cột biểu diễn phần tử từ
0 đến n.
• C[i, j] lưu trữ gí trị của Newton(i, j) theo quy tắc sau ( quy tắc tam giác
Pascal):
o C[0,0]=1;

o C[i, 0]=1;
o C[i, i] =1 với 0< i≤ 𝑛.

o C[i, j] = C[i-1, j-1] + C[i-1, j] với 0
•C(n, k) lưu trữ Newton(n,k).
Thuật tốn:

Từ việc phân tích bài toán trên, ta sử dụng phương pháp quy hoạch động để
giải bài toán như sau:
Int Newton(int n, int k){
Int C[n+1,n+1], i, j;
C[0,0]=1;
For i:=1 to n do{
C[i,0]=1;
C[i,i]=1;
For j:=1 to j do{
C[i,j]=C[i-1, j-1] + C[i-1, j];
}
}
Return C[n,k];
}

j

0

1

2


3

4

i
Page | 8


0

1

1

1

1

2

1

2

1

3

1


3

3

1

4

1

4

6

4

1

3. Bài tốn xếp ba lơ
Bài tốn: Có một ba lơ có thể chứa tối đa trọng lượng W và có n đồ vật, mỗi

đồ vật có trọng lượng 𝑤𝑖 và giá trị tương ứng 𝑏𝑖 ( 1≤ 𝑖 ≤ 𝑛). W, wi , bi là các số
nguyên. Hãy chọn và sắp xếp.
Input: W, n , wi , bi là các giá trị nguyên.

Output: Cách sắp xếp đồ vật vào trong túi sao cho ta thu được chiếc túi mang
được giá trị lớn nhất.
Ví dụ: Cho một cái túi đựng được tối đa 7kg, có 4 đồ vật có trọng lượng và
giá trị tương ứng:

• Trọng lượng:

1

3

4

5

• Giá trị tương ứng:

1

4

5

7
Page | 9


u cầu: Tìm giá trị lớn nhất mà túi có thể lấy được. Biết mỗi vật có thể được
lấy hoặc khơng lấy
Phân tích bài tốn:
• Sử dụng mảng K[0…n,0…W] để lưu trữ giải phải của bài tốn con.
• Ban đầu K[0,j]=K[i,0] với mọi i,j.

• Sau đó K[i,j] sẽ được tính theo K[i-1,j] hoặc K[i-1,j-𝑤𝑖 ].
Giá trị


Trọng
lượng

0

1

2

3

4

5

6

7

0

0

0

0

0


0

0

0

0

0

1

1

0

1

1

1

1

1

1

1


4

3

0

1

1

4

5

5

5

5

5

4

0

1

1


4

5

6

8

9

7

5

0

1

1

4

5

7

8

9


Thuật toán:
Int Caitui( int giatri[], int trongluong[], int n, int W){
Int K[n+1][W+1];
For i:=0 to n{
For w to W{
If ( i==0 or w==0) then K[i][w]=0;
Else if ( w < trongluong[i]) then K[i][w] = K[i-1][w];
Else K[i][w] = max( K[i-1][w], giatri[i] + K[i-1][w - trongluong[i]);
}
}
Return K[n][W];
}
Page | 10


4. Bài tốn tìm đường đi nhỏ nhất
Bài tốn: Cho bảng A[] có kích thước N x M ( N hàng, M cột). Bạn được
phép đi sang trái, đi sang phải và đi xuống ô chéo dưới. Khi đi qua ô (i, j) điểm bạn
nhận được là A[i][j].
Hãy tìm đường đi từ ô (1, 1) tới ô (M, N) sao cho tổng điểm là nhỏ nhất.
Input

Output

1

8

33
123

482
153
Giải thích test : Đường đi (1,1) → (1,2) → (2,3) → (3,3)
Thuật toán:

Int a[n+5][m+5];
Int F[n+5][m+5];
For i:=1 to n do{
For j:=1 to m do{
If( i=1 and j =1) F[i][j]=a[i][j];
Else if ( i=1) F[i][j] = a[i][j] + F[i][j-1];
Else if ( j=1) F[i][j] = a[i][j] + F[i-1][j];
Else F[i][j] = a[i][j] + min(F[i-1][j-1], F[i-1][j], F[i][j-1]);
}
}
Return F[n][m];

5. Bài toán tìm dãy con chung dài nhất

Page | 11


Bài toán: Cho 2 chuỗi X và Y, tương ứng có độ dài lần lượt là m và n. Tìm dãy
con chung dài nhất của X và Y (các phần tử khơng nhất thiết phải liên tiếp
nhau).
Ví dụ: X=<B, U, N, H> và Y=<B, U, I, H, O, A, N, G>.
Kết quả: Độ dài của dãy con chung dài nhất là 3 là chuỗi <B, U, H> hoặc
<B, U, N>.
Phân tích bài tốn:
• Ta ký hiệu:

o 𝑋𝑖 = 𝑥1 𝑥2 . . . 𝑥𝑛 là thứ tự các phần tử của X.
o 𝑌𝑗 = 𝑦1 𝑦2 . . . 𝑦𝑛 là thứ tự các phần tử của Y.

• Ta dùng mảng C[0…n,0…m] để lưu giá trị độ dài của các dãy con
chung dài nhất của các cặp tiền tố.
• Gọi C[i, j] là độ dài dãy con chung dài nhất của 𝑋𝑖 𝑣à 𝑌𝑗 .

• Khi đó độ dài dãy con chung dài nhất của X và Y là C[n,m].
0
𝑖 = 0 ℎ𝑜ặ𝑐 𝑗 = 0
𝑖, 𝑗 > 0 , 𝑥𝑖 = 𝑦𝑖
• Ta có: C[i, j] = { 𝐶[𝑖 − 1, 𝑗 − 1] + 1
𝑚𝑎𝑥(𝐶[𝑖 − 1, 𝑗], 𝐶[𝑖, 𝑗 − 1]
𝑖, 𝑗 > 0, 𝑥𝑖 ≠ 𝑦𝑖
i

0

1

2

3

4

B

U


N

H

0

0

0

0

0

j

0
1

B

0

1

1

1

1


2

U

0

1

2

2

2

3

I

0

1

2

2

2

4


H

0

1

2

2

3

5

O

0

1

2

2

3

6

A


0

1

2

2

3

7

N

0

1

2

3

3

Page | 12


8


G

0

1

2

3

3

Kết luận: Vậy dãy con chung dài nhất của BUIHOANG và BUNH là 3 là dãy
BUH hoặc BUN.
Thuật toán:
Int C[m,n];
For i:=0 to m
For j:=0 to n
If(i=0 or j=0) then C[i, j]=0;
Else
If (Xi = Yj) then C[i,j] = C[i-1,j-1] + 1;
Else C[i,j]= max(C[i,j-1], C[i-1,j]);
6. Bài tốn tìm dãy con đơn điệu tăng dài nhất khơng liên tiếp

Bài tốn: Cho một dãy số nguyên gồm n phần tử 𝑎1 , 𝑎2 , . . . , 𝑎𝑛 . Hãy tìm một
dãy con của dãy đã cho sao cho các phần tử là đơn điệu tăng.
Input: Dòng đầu số nguyên n là độ dài của dãy.

Dòng sau gồm n phần tử 𝑎1 , 𝑎2 , . . . , 𝑎𝑛 cách nhau một dấu cách.
Output: Độ dài của dãy con tăng dài nhất.

Danh sách các phần tử trong dãy con đó.
Ví dụ:
Input

Output

10

6

3457821293

345789

Phân tích bài tốn:
• Trước tiên ta sẽ lập một mảng A[0…n] để lưu các giá trị của
𝑎1 , 𝑎2 , . . . , 𝑎𝑛 và một mảng con L.

• Với i chạy từ 0 tới n. ta sẽ dùng mảng L để lưu lại giá trị theo công thức
truy hồi.
Page | 13


Ví dụ với A[2]=5 ta xét i chạy từ 0 đến 2, nếu như khơng có giá trị A[i]
nào lớn hơn A[2] thì L[2] = L[1]+1. Cịn nếu như tồn tại giá trị i thuộc
(0,2) sao cho A[i] > A[2] thì ta sẽ tính lại L[i]=1 tại vị trí lớn hơn đó.
Lặp lại cho tới khi chạy hết các giá trị.
• Ta tìm được cơng thức truy hồi:
{
i


𝒏ế𝒖 ∃𝒋 = (𝟎, 𝒊) 𝒔𝒂𝒐 𝒄𝒉𝒐 𝒂𝒊 < 𝒂𝒋

𝑳[𝒊] = 𝟏

𝑳[𝒊] = 𝑴𝒂𝒙𝑳[𝒋]𝟎≤𝒋<𝒊 + 𝟏

𝒏ế𝒖 𝒂𝒊 > 𝒂𝒋 ∀𝒋 = (𝟎, 𝒊)

0

1

2

3

4

5

6

7

8

9

Mảng 3

A

4

5

7

8

2

1

2

9

3

Mảng 1

2

3

4

5


1

1

2

6

1

L
Kết luận: Vậy độ dài chuỗi con dài nhất là 6: <3, 4, 5, 7, 8, 9>.
Thuật toán:
Int A[100],Int L[100];
Int Lmax //lưu giá trị max từ đầu tới phần tử i
L[0]=1;
For i:= 1 to n do{
Lmax=0;
For j:=0 to i
{
If ( A[i] > A[j] )
If (L[j]>Lmax) then Lmax=L[j];
}
L[i]=Lmax +1;
}

Page | 14


C. Kết luận

Quy hoạch động là một thuật toán hiện đại, một lớp thuật tốn quan trọng, hiệu
quả và có ứng dụng nhiều trong ngành khoa học máy tính. Thuật tốn quy hoạch động
có có thể giải được hầu hết các bài toán tối ưu. Tuy nhiên khi giải bài tốn quy hoạch
động, ta cần tìm đến cơng thức truy hồi của nó thật đúng đắn, tối ưu và chứng minh
được độ chính xác tin cậy của nó.
Một số tài liệu hay nên tham khảo về quy hoạch động:
• Dynamic Programming || Richard Bellman
• Dynamic Programming and Optimal Control || Dimitri Bertsekas
• Algorithm Design Techniques || Narasimha Karumanchi

Page | 15



×