MỤC LỤC MỞ ĐẦU.......................................................................................................................... .......................................................................................................................... 3 I. CÔNG THỨ C TRUY HỒI .............................................. .................................................................................... ...................................... 3 II. BÀI TOÁN QUY HOẠCH.................................................................................... .................................................................................... 5 III. PHƯƠNG PHÁP QUY HOẠCH ĐỘ NG ............................................... ........................................................... ............ 6 1. Quy hoạch động và đệ quy ................................................................................. ................................................................................. 6 2. Ví dụ ............................................ ............................................................................................. ....................................................................... ...................... 6 3. Yêu cầu để áp dụng quy hoạch động .................................................................. .................................................................. 7 4. Các khái niệm: ............................................. .............................................................................................. ....................................................... ...... 7 5. Các bước cài đặt một chương trình sử dụng quy hoạch động: ........................... 8 MỘT SỐ BÀI TOÁN QUY HOẠCH ĐỘ NG ................................................................. ................................................................. 9 I. Dãy con đơn điệu tăng dài nhấ t ............................................... ............................................................................. .............................. 9 1. Mô hình................................................ ................................................................................................... ............................................................... ............ 9 2. Công thức truy hồi: ............................................................................................. ............................................................................................. 9 3. Truy vết............................................................................................................... ............................................................................................................... 9 4. Nhận xét:.............................................. ............................................................................................... ............................................................. ............ 10 5. Một số vấn đề liên quan ................................................ .................................................................................... .................................... 10 6. Một số bài toán khác ............................................. ......................................................................................... ............................................ 10 a) Bố trí phòng họ p................................................ ............................................................................................ ............................................ 10 b) Cho thuê máy .................................................... ................................................................................................ ............................................ 10 c) Dãy tam giác bao nhau .............................................. .................................................................................. .................................... 11 d) Dãy đổi dấu .............................................. ............................................................................................... ..................................................... .... 11 II. Chia k ẹo .................................................. ..................................................................................................... ............................................................. .......... 12 1. Mô hình................................................ ................................................................................................... ............................................................. .......... 12 2. Công thức........................................................................................................ ............................................................................................................ 12 3. Cài đặt............................................................................................................... ............................................................................................................... 12 4. Nhận xét ............................................................... ............................................................................................................ ............................................. 12 5. Một số bài toán khác ............................................. ......................................................................................... ............................................ 12 a) Chia k ẹo......................................................................................................... ......................................................................................................... 12 b) Market (Olympic Balkan 2000) ................................................ .................................................................... .................... 13 c) Điền dấu ............................................................................................ ........................................................................................................ ............ 13 d) Expression (ACM 10690) 10690) ................................................. ............................................................................. ............................ 14 III. Xâu con chung dài nhất ................................................ .................................................................................... .................................... 14 1. Mô hình................................................ ................................................................................................... ............................................................. .......... 14 2. Công thức QHĐ ................................................................................................ ............................................................................................... 14 3. Cài đặt............................................................................................................... ............................................................................................................... 14 4. Một số bài toán khác ............................................. ......................................................................................... ............................................ 15 a) Bắc cầu ............................................. .............................................................................................. ............................................................. ............ 15 b) Biến đổi xâu ............................................. .............................................................................................. ..................................................... .... 15 c) Palindrom (IOI 2000) ................................................ .................................................................................... .................................... 16 IV. Xế p balô ............................................... .................................................................................................. ............................................................. .......... 17
1. 2. 3. 4.
Mô hình................................................ ................................................................................................... ............................................................. .......... 17 Công thức........................................................................................................ ............................................................................................................ 17 Cài đặt............................................................................................................... ............................................................................................................... 17 Một số bài toán khác ............................................. ......................................................................................... ............................................ 18 a) Farmer (IOI 2004) ............................................. ......................................................................................... ............................................ 18 b) Đổi tiền ............................................. .............................................................................................. ............................................................. ............ 18 V. Nhân ma tr ận ........................................................................................................ ........................................................................................................ 19 1. Mô hình................................................ ................................................................................................... ............................................................. .......... 19 2. Công thức........................................................................................................ ............................................................................................................ 19 3. Cài đặt............................................................................................................... ............................................................................................................... 20 4. Một số bài toán khác ............................................. ......................................................................................... ............................................ 20 a) Chia đa giác ................................................................................................... .................................................................................................. 20 b) Biểu thức số học (IOI 1999).............................................. .......................................................................... ............................ 21 VI. Di chuyển.......................................................................................................... .......................................................................................................... 21 1. Mô hình................................................ ................................................................................................... ............................................................. .......... 21 2. Công thức........................................................................................................ ............................................................................................................ 21 3. Cài đặt............................................................................................................... ............................................................................................................... 22 4. Một số bài toán khác ............................................. ......................................................................................... ............................................ 22 a) Tam giác giác (IOI 1994).................................................. ...................................................................................... .................................... 22 b) Con kiến ............................................................................................ ........................................................................................................ ............ 22 K ẾT LUẬ N ............................................... .................................................................................................. ..................................................................... .................. 23 TÀI LIỆU THAM KHẢO.............................................................................................. .............................................................................................. 24
MỞ ĐẦU I.
CÔNG THỨ C TRUY HỒI Cho số t ự nhiên n < 100. Hãy cho bi ết có bao nhiêu cách phân tích s ố n thành tổng của dãy các số nguyên dương, các cách phân tích là hoán vị của nhau chỉ tính là một cách. Ví dụ: n = 5 có 7 cách phân tích: 1.
5=1+1+1+1+1
2.
5=1+1+1+2
3.
5=1+1+3
4.
5=1+2+2
5.
5=1+4
6.
5=2+3
7.
5=5
(Lưu ý: n = 0 vẫ n coi là có 1 cách phân tích thành t ổng các s ố nguyên dương (0 là tổng của dãy r ỗng)) Để gi ải bài toán này, trong chuyên m ục trước ta đã dùng phương pháp liệ t kê tất c ả các cách phân tích và đế m số cấu hình. Bây gi ờ ta thử nghĩ xem, có cách nào tính ngay ra số lượ ng các cách phân tích mà không c ần phải liệt kê hay không ?. B ở i vì khi s ố cách phân tích tương đối lớn, phương pháp liệ t kê tỏ ra khá ch ậm. (n = 100 có 190569292 cách phân tích). Nhận xét: Nếu gọi F(m, v) là số cách phân tích s ố v thành tổng các số nguyên dương < m. Khi
đó: Các cách phân tích s ố v thành tổng các s ố nguyên dương < m có thể chia làm hai lo ại:
• Loại 1: Không chứa s ố m trong phép phân tích, khi đó số cách phân tích lo ại này chính là số cách phân tích s ố v thành tổng các số nguyên dương < m, tứ c là số cách phân tích số v thành tổng các s ố nguyên dương < m - 1 và bằng F(m - 1, v). • Loại 2: Có ch ứa ít nhất một số m trong phép phân tích. Khi đó nế u trong các cách phân tích loại này ta bỏ đi số m đó thì ta sẽ đượ c các cách phân tích s ố v - m thành t ổng
các số nguyên dương < = m (Lưu ý: điều này chỉ đúng khi không tính lặ p l ại các hoán v ị của một cách). Nghĩa là về mặt số lượ ng, số các cách phân tích lo ại này bằng F(m, v - m).
Trong trườ ng hợ p m > v thì rõ ràng chỉ có các cách phân tích lo ại 1, còn trong trườ ng hợ p m <= v thì sẽ có cả các cách phân tích lo ại 1 và loại 2. Vì thế: • F(m, v) = F(m - 1, v) n ếu m > v • F(m, v) = F(m - 1, v) + F(m, v - m) n ếu m <= v Ta có công th ức xây dựng F(m, v) từ F(m - 1, v) và F(m, v - m). Công th ức này có tên gọi là công thức truy hồi đưa việ c tính F(m, v) v ề việc tính các F(m', v') vớ i dữ liệu nhỏ hơn. Tất nhiên cuối cùng ta s ẽ quan tâm đến F(n, n): Số các cách phân tích n thành t ổng các số nguyên dương < = n. Ví dụ vớ i n = 5, b ảng F sẽ là: 1 2 3 4 5 F 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 2 1 1 2 2 3 3 3 1 1 2 3 4 5 4 1 1 2 3 5 6 5 1 1 2 3 5 7 m Nhìn vào bảng F, ta thấy r ằng F(m, v) đượ c tính bằng tổng của:
v
• Một phần tử ở hàng trên: F(m - 1, v) • và một phần tử ở cùng hàng, bên trái: F(m, v - m). Ví dụ F(5, 5) sẽ đượ c tính bằng F(4, 5) + F(5, 0), hay F(3, 5) s ẽ đượ c tính bằng F(2, 5) + F(3, 2). Chính vì v ậy để tính F(m, v) thì F(m - 1, v) và F(m, v - m) ph ải đượ c tính trướ c. Suy ra thứ tự hợp lý để tính các ph ần t ử trong bảng F sẽ phải là theo th ứ tự từ trên xuống và trên mỗi hàng thì tính theo th ứ tự từ trái qua phải.
Điều đó có nghĩa là ban đầ u ta phải tính hàng 0 c ủa bảng: F(0, v) = số dãy có các phần tử < 0 mà tổng bằng v, theo quy ướ c ở đề bài thì F(0, 0) = 1 còn F(0, v) v ớ i mọi v > 0 đều là 0.
Vậy giải thuật dựng r ất đơn giả n: Khở i tạo dòng 0 của bảng F: F(0, 0) = 1 còn F(0, v) vớ i mọi v > 0 đề u b ằng 0, sau đó dùng công thứ c truy hồi tính ra t ất c ả các phần t ử c ủa bảng F. Cuối cùng F(n, n) là s ố cách phân tích c ần tìm
II.
BÀI TOÁN QUY HOẠCH Bài toán quy ho ạch là bài toán t ối ưu: gồ m có một hàm f gọi là hàm m ục tiêu hay hàm đánh giá; các hàm g1, g2, ..., gn cho giá trị logic gọi là hàm ràng bu ộc. Yêu cầu c ủa bài toán là tìm m ột cấu hình x thoả mãn tất cả các ràng buộc g1, g2, ...gn: gi(x) = TRUE (Vớ i 1<= i <= n) và x là t ốt nh ất, theo nghĩa kh ông tồn t ại m ột c ấu hình y nào khác tho ả mãn các hàm ràng bu ộc mà f(y) t ốt hơn f(x). Ví dụ:
Tìm (x, y) để Hàm mục tiêu: x + y max Hàm ràng buộc: x2 + y2 <= 1. Xét trong mặt phẳng toạ độ, những cặ p (x, y) tho ả mãn x2 + y2 <= 1 là tọa độ của những điểm nằm trong hình tròn có tâm O là gốc toạ độ, bán kính 1. V ậy nghiệm của bài toán b ắt buộc nằm trong hình tròn đó. Những đườ ng thẳng có phương trình: x + y = C (C là một hằng số) là đườ ng thẳng vuông góc v ới đườ ng phân giác góc ph ần tư thứ nhất. Ta phải tìm số C l ớ n nhất mà đườ ng thẳng x + y = C vẫn có điểm chúng với đườ ng tròn (O, 1). Đườ ng thẳng đó là một tiế p tuyến của đườ ng tròn: + = √2 Tiếp điểm (1/√2,1/√2) tương ứng vớ i nghiệm tối ưu của bài toán đã cho. Các dạng bài toán quy ho ạch r ất phong phú và đa dạ ng, ứng d ụng nhiều trong thực tế, nhưng cũng cầ n biết r ằng, đa số các bài toán quy ho ạch là không giải đượ c, hoặc chưa giải được. Cho đến nay, ngườ i ta mớ i ch ỉ có thuật toán đơn hình giả i bài toán quy hoạch tuyến tính lồi, và một vài thuật toán khác áp d ụng cho các lớ p bài toán cụ thể.
PHƯƠNG PHÁP QUY HOẠCH ĐỘNG ạch động và đệ quy 1. Quy ho Phương pháp quy hoạch độ ng dùng để giải bài toán tối ưu có bản chất đệ quy, tức là việc tìm phương án tối ưu cho bài toán đó có thể đưa về tìm phương án tối ưu củ a một số hữu h ạn các bài toán con. C ả hai phương pháp đề u s ử d ụng nguyên lý chia để tr ị (divide and conquer). Điểm khác nhau gi ữa quy hoạch động và phép phân gi ải đệ quy và cũng là nội dung phương pháp quy hoạch độ ng:
III.
Phép phân giải đệ quy bắt đầu từ bài toán lớ n phân rã thành nhi ều bài toán con và đi giải t ừng bài toán con đó. Việ c gi ải t ừng bài toán con l ại đưa về phép phân rã ti ế p thành nhiều bài toán nh ỏ hơn và lại đi giả i ti ế p bài toán nh ỏ hơn đó bấ t k ể nó đã đượ c gi ải hay chưa, sử dụng hướ ng tiế p cận từ trên xuống (top-down). Quy hoạch động bắt đầu từ việc giải tất cả các bài toán nh ỏ nhất (bài toán cơ sở) để từ đó từng bướ c giải quyết 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), sử dụng hướ ng tiế p cận từ dướ i lên (bottom-up).
ụ 2. Víd Xét bài toán tính giá tr ị số Fibonacci th ứ n F(1) = F(2) = 1 F(n) = F(n-1) + F(n-2), v ớ i n>=2
Xét hai cách cài đặt chương trình Cách 1
Cách 2
long F(int n){
long F(100];
if(n<3) return 1;
int main(){
else
int i;
return F(n-1)+F(n-2);
F[1] = F[2] = 1;
}
for(i=3;i<=6;i++)
int main(){
F[i] = F[i-1]+F[i-2];
printf(“%ld”, F(6));
printf(“%ld”, F[6]);
return 0;
return 0;
}
}
Trong cách 1, ta vi ết m ột hàm đệ quy F(i) để tính số Fibonacci th ứ i. Chương trình chính gọi F(6), nó sẽ gọi tiếp F(5) và F(4) để tính ... Quá trình tính toán có th ể vẽ như cây dưới đây. Ta nhận thấy để tính F(6) nó ph ải tính 1 l ần F(5), hai l ần F(4), ba lần F(3), năm lần F(2), ba lần F(1).
Cách 2 thì không như vậy. Trướ c hết nó tính sẵn F[1] và F[2], từ đó tính tiế p F[3], lại tính tiếp được F[4], F[5], F[6]. Đả m bảo r ằng mỗi giá tr ị Fibonacci chỉ phải tính 1 lần. (Cách 2 còn có thể cải tiến thêm nữa, chỉ cần dùng 3 giá tr ị tính lại lẫn nhau) Vớ i cách 2, số phép tính giảm đi nhiều so vớ i cách th ứ nhất.
ụng quy ho ạch động 3. Yêu c ầu để áp d Trướ c khi áp dụng phương pháp quy hoạch độ ng ta phải xét xem phương pháp đó có thoả mãn những yêu cầu dưới đây hay không:
Bài toán lớ n phải phân rã đượ c thành nhiều bài toán con, mà s ự phối h ợ p l ờ i giải của các bài toán con đó cho ta lờ i giải của bài toán lớ n. Vì quy hoạch động là đi giả i tất cả các bài toán con, nên n ếu không đủ không gian vật lý lưu trữ lờ i giải (bộ nhớ, đĩa...) để phối hợp chúng thì phương pháp quy hoạch động cũng không thể thực hiện đượ c. Quá trình từ bài toán cơ sở tìm ra l ờ i gi ải bài toán ban đầ u phải qua hữu hạn bướ c.
4. Các khái ni ệm:
Bài toán gi ải theo phương pháp quy h oạch động gọi là bài toán quy ho ạch động
Công thức ph ối h ợ p nghi ệm của các bài toán con để có nghiệm c ủa bài toán lớ n gọi là công th ức truy hồi của quy hoạch động Tậ p các bài toán nh ỏ nhất có ngay lờ i giải để từ đó giải quyết các bài toán l ớ n hơn gọi là cơ sở quy hoạch động Không gian lưu trữ lờ i giải các bài toán con để tìm cách phối hợ p chúng gọi là bảng phương án của quy hoạch động
5. Các bước cài đặt m ột chương trình sử d ụng quy ho ạch động:
Giải tất cả các bài toán cơ sở (thông thườ ng r ất dễ), lưu các lờ i giải vào bảng phương án. Dùng công thức truy hồi phối hợ p những lờ i giải của những bài toán nhỏ đã lưu trong bảng phương án để tìm lờ i giải c ủa những bài toán lớn hơn và lưu chúng vào bảng phương án. Cho tới khi bài toán ban đầu tìm đượ c lờ i giải. Dựa vào bảng phương án, truy vế t tìm ra nghi ệm tối ưu.
MỘT SỐ BÀI TOÁN QUY HO ẠCH ĐỘNG Dãy con đơn điệu tăng dài nhất
I.
1. M ô hình
Cho dãy a1,a2,..an. Hãy tìm m ột dãy con tăng có nhiề u phần tử nhất c ủa dãy. Một dãy con của A là một cách ch ọn ra trong A một số phần tử giữ nguyên thứ tự. Như vậy A có tổng cộng 2n dãy con. 2. Công th ứ c truy h ồi:
Giả s ử v ớ i i từ n đế n 0, ta cần tính L(i): độ dài dãy con tăng dài nhất b ắt đầu t ại ai. L(i) được tính trong điề u kiện L(i + 1), L(i + 2), ..., L(n + 1) đã biết:
Dãy con đơn điệu tăng dài nhất bắt đầu từ ai sẽ đượ c thành lậ p bằng cách lấy ai ghép vào đầu m ột trong số nh ững dãy con đơn điệu tăng dài nhấ t b ắt đầu t ại v ị trí aj đứng sau ai. Ta sẽ ch ọn dãy nào để ghép ai vào đầ u? T ất nhiên là ch ỉ được ghép ai vào đầu những dãy con bắt đầu tại aj nào đó lớn hơn ai (để đảm bảo tính tăng) và dĩ nhiên ta sẽ chọn dãy dài nhất để ghép ai vào đầu (để đảm bảo tính dài nhất). Vậy L(i) được tính như sau: Xét tấ t cả các chỉ số j trong khoảng từ i + 1 đến n + 1 mà aj > ai, ch ọn ra chỉ số jmax có L(jmax) lớ n nhất. Đặt L(i) = L(jmax) + 1. ết 3. Truy v Tại bướ c xây dựng dãy L, mỗi khi tính L(i) = L(jmax) + 1, ta đặt T(i) = jmax. Để lưu lại r ằng: Dãy con dài nh ất bắt đầu tại ai sẽ có phần tử thứ hai k ế tiế p là ajmax. Sau khi tính xong hay dãy L và T, ta b ắt đầu từ 0. T(0) là ph ần tử đầu tiên đượ c chọn, T(T(0)) là ph ần tử thứ hai đượ c chọn, T(T(T(0))) là ph ần tử thứ ba đượ c chọn ... Ví dụ: vớ i A=(5, 2, 3, 4, 9, 10, 5, 6, 7, 8). Hai dãy Length và Trace sau khi tính s ẽ là: i
0
1
2
3
4
5
6
7
8
9
10
11
ai
-∞
5
2
3
4
9
10
5
6
7
8
+∞
Length(i)
9
5
8
7
6
3
2
5
4
3
2
1
Trace(i)
2
8
3
4
7
6
11
8
9
10
11
4. Nh ận xé t:
1. Ta có thể làm cách khác: G ọi L(i) là độ dài dãy con dài nhất k ết thúc tại a(i), T(i) là chỉ số đứng liền trướ c ai trong dãy con dài nh ất đó. Cách này khi truy vế t sẽ cho thứ tự các chỉ số đượ c chọn giảm dần. 2. Dùng mảng T lưu vết để có chương trình ngắ n g ọn ch ứ th ực ra không cần có nó vẫn có thể dò lại đượ c nghiệm, chỉ cần dùng mảng L mà thôi.
ố v ấn đề liên quan 5. M ột s a) Có bao nhiêu dãy con đơn điệu tăng dài nhấ t ? b) Cho biết tất cả những dãy con đơn điệu tăng dài nhất đó
ố bài toán khác 6. M ột s Bài toán dãy con đơn điệu tăng dài nhất có biến thể đơn giản nhất là bài toán dãy con đơn điệ u giảm dài nhất, tuy nhiên chúng ta có th ể coi chúng như là một. Sau đây là mộ t số bài toán khác. a) Bố trí phòng họ p
Có n cuộc họ p, cuộc họ p thứ i bắt đầu vào thờ i điểm ai và k ết thúc ở thời điểm bi. Do chỉ có m ột phòng hội th ảo nên 2 cuộc họ p bất kì sẽ đượ c cùng bố trí phục vụ nếu khoảng thờ i gian làm vi ệc của chúng chỉ giao nhau tại đầu mút. Hãy bố trí phòng họp để phục vụ đượ c nhiều cuộc họ p nhất. Gợ i ý: Sắ p xế p các cuộc họp tăng dần theo thời điể m k ết thúc (bi). Th ế thì cuộc họ p i sẽ bố trí đượ c sau cuộc họ p j nếu và chỉ nếu j < i va` bj ≤ ai. Yêu cầ u bố trí đượ c nhiều cuộc họ p nhất có thể đưa về việc tìm dãy các cu ộc họ p dài nhất thoả mãn điều kiện trên. b) Cho thuê máy
Trung tâm tính toán hi ệu năng cao nhận được đơn đặt hàng của n khách hàng. Khách hàng i muốn sử dụng máy trong khoảng thờ i gian từ ai đến bi và tr ả tiền thuê là ci. Hãy b ố trí lịch thuê máy để tổng số tiền thu đượ c là lớ n nhất mà thờ i gian sử dụng máy của 2 khách hàng bất kì đượ c phục vụ đều không giao nhau (c ả trung tâm chỉ có một máy cho thuê). Gợ i ý:
Tương tự như bài toán a), nế u sắ p xếp các đơn đặt hàng theo th ời điể m k ết thúc, ta sẽ đưa đượ c bài toán b) về bài toán tìm dãy con có t ổng lớ n nhất. Bài toán này là bi ến thể của bài toán tìm dãy con tăng dài nhấ t, ta có th ể cài đặt bằng đoạn chương trình như sau: for (i=1;i<=n;i++) { L[i]=c[i]; for (j=1;j<=i-1;j++) if ((b[j]<=a[i]) && (L[i]
c) Dãy tam giác bao nhau
Cho n tam giác trên m ặt phẳng. Tam giác i bao tam giác j n ếu 3 đỉnh của tam giác j đều nằm trong tam giác i (có th ể nằm trên cạnh). Hãy tìm dãy tam giác bao nhau có nhi ều tam giác nh ất. Gợ i ý: Sắ p xếp các tam giác tăng dần về diện tích. Khi đó tam giác i sẽ bao tam giác j n ếu j < i và 3 đỉ nh của j nằm trong i. T ừ đó có thể đưa về bài toán tìm dãy tăng dài nhất. Việc kiểm tra điểm M có nằm trong tam giác ABC không có th ể dựa trên phương pháp tính diện tích: điể m M nằm trong nếu S(ABC) = S(ABM) + S(ACM) + S(BCM). Bài toán có m ột số biến thể khác như tìm dãy hình tam giác, hình chữ nhật bao nhau có tổng diện tích lớ n nhất. d)
Dãy đổ i d ấu
Cho dãy a1, a2,... an. Hãy dãy con đổ i dấu dài nhất của dãy đó. Dãy con con đổ i dấu ai1,ai2,... aik phải thoả mãn các điều kiện sau:
Gợ i ý:
ai1
ai3 <... ho ặc ai1 > ai2 < ai3 >... các chỉ số phải cách nhau ít nh ất L: i2 - i1 ≥ L, i3 -i2 ≥ L... chênh lệch giữa 2 phần tử liên tiế p nhỏ hơn U: |ai1 - ai2| ≤ U, |ai2 - ai3| ≤ U...
Gọi L(i) là s ố phần tử của dãy con đổi dấu có phần tử cuối cùng là ai và ph ần tử cuối cùng lớn hơn phầ n tử đứng trước. Tương tự , P(i) là số phần tử của dãy con đổi dấu có phần tử cuối cùng là ai và ph ần tử cuối cùng nhỏ hơn phần tử đứng trướ c. Ta dễ dàng suy ra:
L(i) = max(1, P(j)+1): j ≤ i - L và ai - U ≤ aj < ai. P(i) = max(1, L(j)+1): j ≤ i - L và ai < aj ≤ ai + U. II.
Chia k ẹo
1. M ô hình
Cho dãy a1, a2,.. an. Tìm m ột dãy con của dãy đó có tổng bằng S. 2. Công th ứ c
Đặt L(i, t)=1 n ếu có thể tạo ra tổng t từ một dãy con của dãy gồm các phần tử a1,a2,..ai. Ngượ c lại thì L(i, t)=0. N ếu L(n, S)=1 thì đáp án của bài toán trên là 'có'. Ta có thể tính L(i, t) theo công th ức: L(i, t) = 1 n ếu L(i - 1, t)=1 ho ặc L(i-1, t - a(i))=1. 3. Cài đặt
Nếu áp dụng luôn công th ức trên thì ta c ần dùng bảng phương án hai chiề u. Ta có th ể nhận xét r ằng để tính dòng thứ i, ta chỉ cần dòng i -1. Bảng phương án khi đó chỉ cần mảng 1 chiều L[S] và được tính như sau: L[t]=0; L[0]=1; for (i=1; i<=n; i++) for (t=S;t>=a[i];t--) if ((L[t]==0) && (L[t – a[i]]=1)) L[t]=1;
4. Nh ận xé t
Dễ thấy chi phí không gian c ủa cách cài đặt trên là O(m), chi phí th ờ i gian là O(nm), vớ i m là t ổng của n số.
ố bài toán khác 5. M ột s a) Chia k ẹo
Cho n gói k ẹo, gói thứ i có ai viên. Hãy chia các gói thành 2 ph ần sao cho chênh lệch giữa 2 phần là ít nhất.
Hướ ng dẫn:
Gọi T là t ổng số k ẹo của n gói. Chúng ta c ần tìm số S lớ n nhất thoả mãn: S ≤ T/2. Có một dãy con của dãy a có t ổng b ằng S. Khi đó sẽ có cách chia v ớ i chênh lệch 2 phần là T - 2S là nhỏ nhất và dãy con có t ổng bằng S ở trên gồm các phần tử là các gói k ẹo thuộc phần thứ nhất. Phần thứ hai là các gói k ẹo còn lại. b) Market (Olympic Balkan 2000)
Người đánh cá Clement bắt đượ c n con cá, kh ối lượ ng mỗi con là ai, đem bán ngoài chợ . ở chợ cá, ngườ i ta không mua cá theo t ừng con mà mua theo một lượng nào đó. Chẳ ng hạn 3 kg, 5kg... Ví dụ: có 3 con cá, kh ối lượ ng lần lượt là: 3, 2, 4. Mua lượ ng 6 kg sẽ phải lấy con cá thứ 2 và và thứ 3. Mua lượ ng 3 kg thì l ấy con thứ nhất. Không thể mua lượ ng 8 kg. Nếu bạn là người đầu tiên mua cá, có bao nhiêu lượ ng bạn có thể chọn?
Hướ ng dẫn: Thực chất bài toán là tìm các s ố S mà có một dãy con của dãy a có t ổng bằng S. Ta có thể dùng phương pháp đánh dấ u của bài chia k ẹo ở trên r ồi đếm các giá tr ị t mà L[t]=1. c)
Điề n d ấ u
Cho n số tự nhiên a1,a2,...,an. Ban đầu các số được đặt liên tiếp theo đúng thứ tự cách nhau bở i d ấu '?': a1?a2?...?an. Cho trướ c s ố nguyên S, có cách nào thay các d ấu '?' bằng dấu + hay dấu - để đượ c một biểu thức số học cho giá tr ị là S không?
Hướ ng dẫn : Đặt L(i, t)=1 nếu có thể điền dấu vào i số đầu tiên và cho k ết quả bằng t. Ta có công thức sau để tính L: L[1,a[1]] =1. L[i,t]=1 nếu L[i - 1, t+a[i]]=1 ho ặc L[i - 1,t – a[i]]=1. Nếu L[n, S]=1 thì câu tr ả lờ i của bài toán là có. Khi cài đặ t, có thể dùng một mảng 2 chiều (lưu toàn bộ bảng phương án) hoặc 2 m ảng một chiều (để lưu dòng i và dòng i - 1). Chú ý là chỉ số theo t c ủa các mảng phải có cả phần âm (tức là từ - T đến T, vớ i T là t ổng của n số), vì trong bài này chúng ta dùng c ả dấu - nên có thể tạo ra các t ổng âm. Bài này có m ột bi ến th ể là đặt d ấu sao cho k ết qu ả là một s ố chia h ết cho k. Ta có thuật giải tương tự bài toán trên b ằng cách thay các phép c ộng, tr ừ bằng các phép c ộng và
tr ừ theo môđun k và dùng mảng đánh dấu vớ i các giá tr ị từ 0 đến k - 1 (là các s ố dư có thể có khi chia cho k). Đáp số của bài toán là L[n,0]. d) Expression (ACM 10690)
Cho n số nguyên. Hãy chia chúng thành 2 nhóm sao cho tích c ủa tổng 2 nhóm là l ớ n nhất.
Hướ ng dẫn : Gọi T là t ổng n số nguyên đó. Giả sử ta chia dãy thành 2 nhóm, g ọi S là tổng của một nhóm, tổng nhóm còn lại là T - S và tích c ủa tổng 2 nhóm là S*(T - S). Bằng phương pháp đánh dấu ta xác định đượ c mọi số S là tổng của một nhóm (như bài Market) và tìm s ố S sao cho S*(T - S) đạt max. III.
Xâu con chung dài nhất 1. M ô hình
Cho 2 xâu X, Y. Hãy tìm xâu con c ủa X và c ủa Y có độ dài lớ n nhất. 2. Công th ức QHĐ
Gọi L(i,j) là độ dài xâu con chung dài nh ất của xâu X(i) g ồm i kí tự phần đầu của X (X(i)= X[1..i]) và xâu Y(j) g ồm j kí tự phần đầu của Y (Y(j) =Y[1..j]). Ta có công thức quy hoạch động như sau: L(0,j)=L(i,0)=0. L(i,j) = L(i - 1,j - 1)+1 n ếu X(i) = Y(j). L(i,j) = max(L(i - 1,j), L(i,j - 1)) n ếu X(i) ≠ Y(j). 3. Cài đặt
Bảng phương án là một mảng 2 chiều L[m, n] để lưu các giá trị của hàm quy hoạch động L[i,j]. Đoạn chương trình cài đặt công thức trên như sau: for(i=0; i<=m; i++) L[i][0]=0; for (j=0;j<=n;j++) L[0][j]=0; for (i=1;i<=m;i++) for (j=1;j<=n;j++) if (X[i]==Y[j]) L[i][j]=L[i – 1][j – 1]+1; else
L[i][j]=max(L[i – 1][j], L[i][j – 1]);
Như vậy chi phí không gian c ủa bài toán là O(n2), chi phí th ờ i gian là O(n2). Có m ột phương pháp cài đặt tốt hơn, chỉ vớ i chi phí không gian O(n) d ựa trên nhận xét sau: để tính ô L(i,j) của b ảng phương án, ta chỉ c ần 3 ô L(i-1, j-1), L(i-1,j) và L(i,j-1). T ức là để tính dòng L(i) thì ch ỉ cần dòng L(i -1). Do đó ta chỉ cần 2 mảng 1 chiều để lưu dòng vừa tính (P) và dòng đang tính (L) mà thôi. ố bài toán khác 4. M ột s a) Bắ c cầu
Hai nướ c Anpha và Beta n ằm ở hai bên bờ sông Omega, Anpha n ằm ở bờ bắc và có M thành phố được đánh số từ 1 đến m, Beta nằm ở bờ nam và có N thành ph ố được đánh số t ừ 1 đến n (theo v ị trí từ đông sang tây). Mỗi thành phố của nước này thườ ng có quan hệ k ết n ghĩa vớ i một s ố thành phố c ủa nước kia. Để tăng cườ ng tình hữu nghị, hai nướ c muốn xây các cây c ầu bắc qua sông, mỗi cây cầu sẽ là nhị p cầu nối 2 thành phố k ết nghĩa. Vớ i yêu cầu là các cây c ầu không đượ c cắt nhau và mỗi thành phố chỉ là đầu cầu cho nhiều nhất là một cây cầu, hãy chỉ ra cách b ắc cầu đượ c nhiều cầu nhất. Hướ ng dẫn: Gọi các thành ph ố của Anpha lần lượ t là a1, a2,...am; các thành ph ố của Beta là b1,b2,...bn. Nếu thành phố ai và bj k ết nghĩa vớ i nhau thì coi ai'b ằng' bj. Để các cây cầu không cắt nhau, nếu ta đã chọn cặ p thành ph ố (ai, bj) để xây cầu thì cặ p tiế p theo ph ải là cặ p (au, bv) sao cho u>i và v>j. Như vậ y các c ặ p thành phố đượ c chọn xây cầu có thể coi là một dãy con chung c ủa hai dãy a và b. Bài toán c ủa chúng ta tr ở thành bài toán tìm dãy con chung dài nh ất, ở đây hai phần tử 'bằng' nhau nếu chúng có quan hệ k ết nghĩa. b) Biế n đổ i xâu
Cho 2 xâu X,Y. Có 3 phép bi ến đổi vớ i xâu X: chèn 1 kí t ự, thay thế một kí tự hoặc xoá một kí tự. Hãy tìm s ố ít nhất các phép biến đổi để biến xâu X thành xâu Y.
Hướ ng dẫn: Gọi F(i, j) là số phép biến đổi ít nhất để biến xâu X(i) gồm i kí tự phần đầu của X (X(i)= X(1..i)) thành xâu Y(j) g ồm j kí tự phần đầu của Y (Y(j) =Y(1..j)). Dễ thấy F(0,j)=j và F(i,0)=i.
Nếu X(i)=Y(j) thì ta ch ỉ phải biến đổi xâu X(i-1) thành xâu Y(j- 1). Do đó F(i,j)=F(i 1,j-1).
Ngượ c lại, ta có 3 cách bi ến đổi: - Xoá kí tự X(i) và biến đổi xâu X(i-1) thành Y(j). Khi đó F(i,j)=F(i -1,j)+1. - Thay thế X(i) bở i Y(j) và biến đổi X(i-1) thành Y(j-1). Khi đó F(i,j)=F(i -1,j-1)+1. - Chèn Y(j) vào X(i) và bi ến đổi X(i) thành Y(j- 1). Khi đó F(i,j)=F(i,j -1)+1. Tổng k ết lại, ta có công th ức QHĐ: F(0,j)=j F(i,0)=i F(i,j) =F(i - 1,j - 1) n ếu X(i) = Y(j). F(i,j) = min(F(i - 1,j),F(i,j - 1),F(i - 1,j - 1))+1 n ếu X(i) ≠ Y(j). c) Palindrom (IOI 2000)
Một xâu gọi là xâu đối xứng (palindrom) nếu xâu đó đọc từ trái sang ph ải hay từ phải sang trái đều như nhau. Cho mộ t xâu S, hãy tìm s ố kí tự ít nhất c ần thêm vào S để S tr ở thành xâu đối xứng.
Hướ ng dẫn: Bài toán này có một công thức QHĐ như sau: Gọi L(i,j) là s ố kí tự ít nhất cần thêm vào xâu con S(i..j) c ủa S để xâu đó trở thành đối xứng. Đáp số của bài toán s ẽ là L(1,n) vớ i n là s ố kí tự của S. Ta có công th ức sau để tính L(i,j): L(i,i)=0. L(i,j)=L(i+1,j - 1) n ếu S(i)=S(j) L(i,j)=max(L(i+1,j), L(i,j - 1)) n ếu S(i) ≠ S(j) Ta có thể cài đặt tr ực tiế p công thức đó bằng phương pháp đệ quy có nhớ . Tuy nhiên khi đó chi phí không gian là O(n2). Ta có thuật toán đơn giản hơn như sau:
Gọi P là xâu đảo c ủa S và T là xâu con chung dài nh ất c ủa S và P. Khi đó các kí tự của S không thuộc T cũng là các kí tự cần thêm vào để S tr ở thành đối xứng. Đáp số của bài toán sẽ là n - k, v ới k là độ dài của T. Ví dụ: S=edbabcd, xâu đả o của S là P=dcbabde. Xâu con chung dài nh ất của S và P là T=dbabd. Như vậy cần thêm 2 kí tự là e và c v ào để S tr ở thành xâu đối xứng.
IV.
Xếp balô
1. M ô hình
Chọn vật, v ật i nặng ai và có giá tr ị bi. Hãy chọn ra một s ố v ật để cho vào balô sao cho tổng khối lượng không vượ t quá m và tổng giá tr ị là lớ n nhất. 2. Công th ứ c
Gọi L(i,t) là t ổng giá tr ị lớ n nhất khi đượ c chọn i vật từ 1 đến i cho vào balô v ớ i tổng khối lượng không vượ t quá t. L(n,m) sẽ là đáp số c ủa bài toán (là giá tr ị l ớ n nhất có đượ c n ếu ch ọn n vật và tổng khối lượng không vượ t m). Công thức tính L(i,t) như sau: L(i,0)=0; L(0,t)=0. L(i,t)=L(i – 1,t) nếu ti. L(i,t)=max(L(i – 1,t), L(i – 1,t – ai)+bi) nếu t ≥ ai.
Trong đó: L(i– 1,t) là giá tr ị có đượ c nếu không đưa vậ t i vào balô, L(i – 1,t – ai)+bi là giá tr ị có đượ c nếu chọn vật i. 3. Cài đặt
Ta có thể dùng một mảng 2 chiều để lưu bảng phương án, tuy nhiên dự a trên nhận xét r ằng để tính dòng i của bảng phương án chỉ cần dòng i – 1, ta chỉ cần dùng 2 mảng một chiều P và L có chỉ số từ 0 đến m để lưu 2 dòng đó. Đoạn chương trình con tính bả ng phương án như sau. L(t) = 0; {với mọi t} for (i = 1;i<=n;i++) { P=L; for (t = 0; t<= m; t++)
if (t>=a[i]) L[t] = max(P[t],P[t–a[i]]); }
Nếu để ý kĩ bạn sẽ thấy r ằng đoạn trình trên ch ỉ viết giống công thức QHĐ chứ chưa tối ưu. Chẳng hạn đã có lệnh gán P=L, sau đó lại có gán L(t)=P(t) v ớ i các giá tr ị t < a(i) là không cần thiết. Bạn đọc có thể tự cải tiến để chương trình tối ưu hơn.Chi phí không gian của cách cài đặt trên là O(m) và chi phí th ờ i gian là O(n.m).
ố bài toán khác 4. M ột s a) Farmer (IOI 2004)
Một ngườ i có N mảnh đất và M dải đất. Các mảnh đất có thể coi là một tứ giác và các dải đất thì coi như một đườ ng thẳng. Dọc theo các d ải đất ông ta tr ồng các cây bách, d ải đất thứ i có ai cây bách. Ông ta cũng trồng các cây bách trên vi ền của các mảnh đất, mảnh đất thứ j có bj cây bách. C ả ở trên các mảnh đất và dải đất, xen giữa 2 cây bách ông ta tr ồng một cây ôliu. Ông ta cho con trai đượ c ch ọn các mảnh đất và dải đất tu ỳ ý với điều ki ện tổng số cây bách không vượt quá Q. Ngườ i con trai ph ải chọn thế nào để có nhiều cây ôliu (loài cây mà anh ta thích) nh ất.
Hướ ng d ẫn: D ễ th ấy mảnh đất th ứ i có ai cây ôliu và d ải đất th ứ j có bj – 1 cây ôliu. Coi các mảnh đất và dải đất là các “đồ vật”, đồ vật thứ k có khối lượ ng wk và giá tr ị vk (nếu k là mảnh đất i thì wkki, n ếu k là dải đất j thì wkj, vkj – 1). Ta cần ch ọn các “đồ vật”, sao cho tổng “khối lượng” của chúng không vượ t Q và tổng “giá trị” là lớ n nhất. Đây chính là bài toán xếp balô đã trình bày ở trên. b)
Đổ i tiề n
Ở đất nước Omega ngườ i ta chỉ tiêu tiền xu. Có N loại tiền xu, loại thứ i có mệnh giá là ai đồng. Một ngườ i khách du l ịch đến Omega du lịch vớ i số tiền M đồng. Ông ta mu ốn đổi số tiền đó ra tiền xu Omega để tiện tiêu dùng. Ông ta cũng muố n số đồng tiền đổi đượ c là ít nhất (cho túi ti ền đỡ nặng khi đi đây đi đó). Bạn hãy giúp ông ta tìm cách đổ i tiền. Hướ ng dẫn: Bài toán này khá gi ống bài toán xế p balô ('khối lượ ng' là mệnh giá, 'giá tr ị' là 1), chỉ có một số thay đổi nhỏ: số đồng xu mỗi loại đượ c chọn tuỳ ý (trong bài toán x ế p balô mỗi đồ vật chỉ đượ c chọn 1 lần) và tổng giá tr ị yêu cầu là nhỏ nhất.
Do đó ta cũng xây dựng hàm QHĐ một cách tương tự: Gọi L(i,t) là s ố đồng xu ít nhất nếu đổi t đồ ng ra i loại tiền xu (từ 1 đến i). Công th ức tính L(i,t) như sau: L(i,0)=0; L(0,t)= ∞ vớ i t>0. L(i,t)=L(i – 1,t) nếu t < ai. L(i,t)=min(L(i – 1,t), L(i,t – ai)+1) nếu t ≥ ai. Công thức này khác công th ức của bài xế p balô ở chỗ: dùng hàm min chứ không phải hàm max (vì c ần tìm cách ch ọn ít hơn) và nế u chọn đồng xu thứ i thì L(i, t)=L(i, t – ai)+1 (vì ta vẫn còn đượ c chọn đồng xu thứ i đó nữa), khác vớ i khi xế p balô là: nếu chọn đồ vật thứ i thì L(i, t)=L(i – 1, t – ai)+bi vì đồ vật i chỉ đượ c chọn một lần.
V.
Nhân ma trận
1. M ô hình
Nhân một ma tr ận kích thướ c m x n v ớ i m ột ma tr ận n x p, số phép nhân ph ải th ực hiện là m.n.p. Mặt khác phép nhân các ma tr ận có tính k ết hợ p, tức là:
(A.B).C = A.(B.C) Do đó khi tính tích nhiề u ma tr ận, ta có th ể thực hiện theo các trình tự khác nhau, mỗi trình tự tính sẽ quyết định số phép nhân c ần thực hiện. Cho N ma tr ận A1, A2 … An, ma tr ận Ai có kích thướ c là di – 1 x di. Hãy xác định trình tự nhân ma tr ận A1.A2…An sao cho số phép nhân cần thực hiện là ít nhất. 2. Công th ứ c
Gọi F(i,j) là số phép nhân để tính tích các ma tr ận từ Ai đến A j (Ai. Ai+1....A j). F(i,i)=0; F(i,i+1)=di – 1.di.di+1 ; F(i,j) = min(F(i,k) + F(k+1,j)+di-1.dk .d j vớ i k=i+1,i+2,...j – 1) F(i,i)=0 là hiển nhiên. F(i,i+1) là số phép nhân khi nhân A i và Ai+1. Ai có kích thướ c di – 1 x d i, Ai+1 có kích thướ c di x di+1, do đó F(i,i+1)=di – 1.di.di+1. Vớ i j>i+1 thì ta th ấy có thể tính Ai.Ai+1...A j bằng cách chọn một vị trí k nào đó để đặt ngoặc theo trình tự: Ai.Ai+1....A j = (Ai..Ak ).(Ak+1..A j)
Ma tr ận k ết qu ả c ủa phép nhân (A i..Ak ) có kích thướ c d i – 1 x dk , ma tr ận k ết quả c ủa phép nhân (Ak+1..A j) có kích thướ c dk x d j. Với cách đặt đó ta sẽ m ất F(i,k) phép nhân để có k ết qu ả trong dấu ngoặc th ứ nh ất, mất thêm F(k+1, j) phép nhân để có k ết qu ả trong dấu ngoặc th ứ hai, và mất d i – 1.dk .d j để nhân 2 ma tr ận k ết quả đó. Từ đó tổng số phép nhân c ủa cách đặt đó là: F(i,k)+F(k+1,j)+di – 1.dk .d j. Ta chọn vị trí k sao cho số phép nhân ít nhất. 3. Cài đặt
Bảng phương án là một mảng 2 chiều F để lưu F(i,j). Chú ý khi cài đặt là để tính đượ c F(i,j), ta phải tính F(i,k) và F(k+1,j) trước. Phương pháp đơn giản để làm điều đó là phương pháp đệ quy có nhớ . Tuy nhiên d ựa vào nhận xét là trong công th ức QHĐ: j– i lớn hơn k– i và j– k, ta có thể tính theo trình t ự khác: tính các ph ần tử F(i,j) vớ i j– i từ nhỏ đến lớ n (không phải là tính các giá tr ị F(i,j) vớ i i,j từ nhỏ đến lớn như vẫn làm). Với cách đó, khi tính đế n F(i,j) thì ta đã có F(i,k) và F(k+1,j). Đoạn chương tr ình tính bảng phương án như sau: for (i=1;i<=n;i++) F[i][i]=0; for (i=1;i<= n–1;i++) F[i][i+1] = d[i–1]*d[i]*d[i+1]; for (m=2; m<= n–1;m++) { for (i=1;i<=n–m; i++) { j=i+m; F[i][j]=∞; for (k=i+1; k<= j–1; k++) F[i][j]=min(F[i][j],F[i][k]+F[k+1][j]+d[i–1]*d[k]*d[j]); } }
Với cách cài đặt trên, chi phí không gian là O(n 2), chi phí thờ i gian là O(n 3) (đây là bài toán có chi phí lớ n nhất trong tất cả các bài toán QHĐ thườ ng gặ p).
ố bài toán khác 4. M ột s a)
Chia đa giác
Cho một đa giác lồi N đỉ nh. Bằng các đườ ng chéo không c ắt nhau, ta có th ể chia đa giác thành N –2 tam giác. Hãy xác định cách chia có t ổng các đườ ng chéo ngắn nhất.
Hướ ng d ẫn : Để đơn giản ta coi mọi đoạn th ẳng n ối 2 đỉnh đều là đườ ng chéo (nếu nối 2 đỉnh trùng nhau ho ặc 2 đỉnh liên tiếp thì có độ dài bằng 0). Gọi F(i,j) là tổng độ dài
các đường chéo khi chia đa giác gồm các đỉnh t ừ i đến j thành các tam giác. N ếu j d(i, k) là độ dài đườ ng chéo (i, k). Tóm l ại công thức QHĐ như sau: F(i,j)=0 vớ i j F(i,j)=min(F(i,k)+F(k,j)+d(i,k)+d(k,j) v ớ i k=i+1,...j – 1). F(1,n) là tổng đườ ng chéo của cách chia t ối ưu. b) Biể u thứ c số học (IOI 1999)
Cho biểu thức a1·a2· … ·an, vớ i ai là các s ố thực không âm và · là m ột phép toán + hoặc x cho trước. Hãy đặt các dấu ngoặc để biểu thức thu đượ c là lớ n nhất.
Hướ ng dẫn: Gọi F(i,j) là giá tr ị lớ n nhất có thể có c ủa bi ểu thức ai · ai+1· …·aj. Dễ thấy nếu i=j thì F(i,j)=ai, n ếu j=i+1 thì F(i,j)=ai·aj. Nếu j>i+1 thì có th ể tính biểu thức ai· ai+1·… ·aj bằ ng cách chia thành 2 nhóm: (ai· ai+1·…· ak)·(ak+1 · … · aj), khi đó F(i,j)=F(i,k)·F(k+1,j). Tóm lại, công thức QHĐ là: F(i,i)=ai; F(i,i+1)=ai·ai+1 F(i,j) = max ( F(i, k)·F(k+1,j) v ớ i k=i+1,i+2,..j – 1). (Chú ý là các h ạng tử của dãy đều không âm và các phép toán là + ho ặc x nên F(i,k) và F(k+1,j) đạt max thì F(i,k)· F(k+1,j) cũng đạ t max).
VI.
Di chuyển
1. M ô hình
Cho bảng A gồm MxN ô. Từ ô (i,j) có thể di chuyển sang 3 ô (i+1,j), (i+1,j – 1) và (i+1,j+1). Hãy xác định một lộ trình đi từ hàng 1 đến hàng M sao cho t ổng các ô đi qua là lớ n nhất. 2. Công th ứ c
Gọi F(i,j) là giá tr ị lớ n nhất có đượ c khi di chuyển đến ô (i,j). Có 3 ô có thể đi đến ô (i,j) là (i – 1,j), (i – 1,j – 1) và (i –1,j+1). Do đó ta có công thức QHĐ sau: F(1,j) = A(1,j) F(i,j) = max(F(i – 1,j),F(i – 1,j – 1), F(i – 1,j+1)) + A(i,j) vớ i i>1
3. Cài đặt
Bảng phương án là bảng 2 chiều F[m][n]. (Tất cả các ô trên biên đều cho giá tr ị bằng 0). Quá trình tính như sau: for (i=1;i<= m; i++) for (j = 1; j<=n;j++) F[i][j]=max(F[i–1][j], F[i–1][j–1], F[i–1][j+1])+A[i][j];
Cách cài đặt này cho chi phí không gian và th ời gian đều là O(n2). Ta có th ể tiết kiệm không gian nhớ bằng cách tính tr ực tiế p trên mảng A. ố bài toán khác 4. M ột s a) Tam giác (IOI 1994)
Cho một tam giác g ồm các số nguyên không âm. Hãy tính t ổng lớ n nhất các số trên đường đi từ đỉnh tam giác xu ống một điểm nào đó ở đáy tam giác. Tại mỗi ô ta ch ỉ có đi thẳng xuống, sang ô bên trái ho ặc bên phải.
Hướ ng dẫn: Mô tả các phần tử của tam giác s ố như một ma tr ận, A(i,j) là phần tử thứ j trên dòng i (với 1 ≤ i ≤ N và 1 ≤ j ≤ i). Có 2 ô có thể di chuyển đến ô (i,j) là ô (i – 1,j – 1) và ô (i – 1,j). Gọi F(i,j) là tổng lớ n nhất có thể có khi đi đến ô (i,j) ta có: F(1,1)=A(1,1) F(i,1)=F(i – 1,1)+A(i,1) F(i,j)=max(F(i – 1,j – 1),F(i – 1,j))+A(i,j) b) Con kiế n
Có một ống hình tr ụ, khi tr ải phẳng ra có th ể là một bảng MxN ô. Giá tr ị A(i,j) là lượ ng thức ăn có tại ô ở dòng i cột j. Một con kiến xuất phát từ 1 ô ở mép bên trái c ủa hình tr ụ và bò sang mép bên ph ải. Từ ô (i,j) kiến có thể bò sang 1 trong 3 ô (i – 1,j+1), (i,j+1) hoặc (i+1,j+1). (Chú ý: vì ống hình tr ụ nên kiến đang ở dòng 1 có thể bò xuống dòng M và ngượ c lại). Bò qua ô nào thì ki ến mang theo toàn b ộ lượ ng thức ăn ở ô đó. Hãy tìm đườ ng đi mà kiến kiếm đượ c nhiều thức ăn nhất.
Hướ ng dẫn: Để xử lí tình huống hình tr ụ, ta lưu dòng 0 là dòng M và dòng M+1 là dòng 1. Khi đó tương tự như bài toán ban đầu, gọi F(i,j) là lượ ng thức ăn kiến có được khi bò đế n ô (i, j), ta thiết lập đượ c công thức QHĐ sau: F(i,1)=A(i,1) F(i, j)=max(F(i – 1, j – 1), F(i, j – 1), F(i+1, j+1))+A(i, j) v ớ i j>1.
K ẾT LUẬN Cho đến nay, vẫn chưa có một định lý nào cho biết một cách chính xác nh ững bài toán nào có th ể giải quyết hiệu quả bằng quy hoạch động. Tuy nhiên để biết đượ c bài toán có thể giải bằng quy hoạch động hay không, ta có th ể tự đặt câu hỏi: “Một nghiệm tối ưu của bài toán lớ n có phải là sự phối hợ p các nghiệm tối ưu của các bài toán con hay không?” và “ Liệu có thể nào lưu trữ đượ c nghiệm các bài toán con dướ i m ột hình th ức nào đó để phối hợp tìm đượ c nghiệm bài toán lớn”. Đối với phương pháp quy hoạch động, lượ ng bộ nhớ dùng để lưu bảng phương án có thể r ất lớ n nên ta ti ết kiệm đượ c càng nhiều càng tốt. Nếu bảng phương án được tính dướ i dạng dùng dòng i tính dòng i + 1 thì rõ ràng vi ệc lưu trữ các dòng i - 1, i - 2... bây gi ờ là không cần thiết, ta có th ể cải tiến bằng cách dùng 2 m ảng trước, sau tương ứ ng vớ i 2 dòng i, i + 1 của bảng và cứ dùng chúng tính lại lẫn nhau, thậm chí chỉ cần dùng 1 mảng tương ứng vớ i 1 dòng và tính l ại chính nó như ví dụ đầu tiên đã làm, như vậ y có thể tiết kiệm đượ c bộ nhớ để chạy các dữ liệu lớ n. Một bài toán quy ho ạch động có thể có nhiều cách tiế p cận khác nhau, ch ọn cách nào là tuỳ theo yêu cầu bài toán sao cho d ễ dàng cài đặt nhất. Phương pháp này thườ ng không khó khăn trong việc tính bảng phương án, không khó khăn trong việc tìm cơ sở quy hoạch động, mà khó khăn chính là nhìn nhậ n ra bài toán quy ho ạch động và tìm ra công th ức truy hồi giải nó, công việc này đòi hỏi sự nhanh nhạy, khôn khéo, mà ch ỉ từ kinh nghiệm và sự rèn luyện mớ i có chứ chẳng có lý thuyết nào cho ta một phương pháp chung thậ t cụ thể để giải mọi bài toán quy ho ạch động cả.
TÀI LIỆU THAM KHẢO [1] Lê Minh Hoàng, Bài giảng chuyên đề bồi dưỡ ng học sinh giỏi (Ebook). [2] Tr ần Lê Hồng Dũ, Phạm Ngọc Chí Nhân, Các bài toán v ề quy hoạch động [3] Nguyễn Xuân My (chủ biên), M ột số thuật toán ch ọn l ọc trong Tin học (tậ p 1) [4] Nguyễn Quý Khang, Kiều Văn Hưng, Bài t ậ p Pascal (tậ p 2), NXB ĐHQG Hà Nội, 2002. [5] Nguyễn Thanh Tùng, M ột s ố bài toán quy ho ạch động kinh điể n (T ạ p chí Tin h ọc và nhà trườ ng, số tháng 01, 02, 03 năm 2005). [6] http://vn.spoj.com [7] http://help.topcoder.com/data-science/competing-in-algorithm-challenges/algorithmtutorials/dynamic-programming-from-novice-to-advanced/