Tài liệu bồi dưỡng học sinh giỏi Quốc gia.Cung cấp các kiến thức mà các học sinh muốn có giải quốc gia phải nắm được.Giúp các em học sinh chuẩn bị tốt cho những kì thi về lập trình.Tài liệu với lý thuyết và lời giải chi tiết.
Trang 2PHƯƠNG PHÁP DUYỆT Chuyên đề 1 Duyệt vét cạn - Backtracking
Quay lui, vét cạn, thử sai, duyệt… là một số tên gọi tuy không đồng nghĩa nhưngcùng chỉ một phương pháp trong tin học: tìm nghiệm của một bài toán bằng cáchxem xét tất cả các phương án có thể Đối với con người phương pháp này thườngkhông khả thi vì số phương án cần kiểm tra lớn Tuy nhiên đối với máy tính, nhờtốc độ xử lý nhanh, máy tính có thể giải rất nhiều bài toán bằng phương phápquay lui vét cạn Người đầu tiên đề ra chiến lược này là nhà toán học người MỹDerrick Henry Lehmer (1905 – 1991) vào những năm 1950
Ưu điểm của phương pháp quay lui, vét cạn là luôn bảo đảm tìm ra nghiệm đúng,chính xác Tuy nhiên, hạn chế của phương pháp này là thời gian thực thi lâu, độphức tạp lớn
Về bản chất, tư tưởng của phương pháp này là thử từng khả năng cho đến khi tìm thấy lời giải đúng Đó là một quá trình tìm kiếm theo độ sâu trong một tập các lời giải Trong quá trình tìm kiếm, nếu gặp một hướng lựa chọn không thỏa mãn, ta quay lui, về điểm lựa chọn có các hướng khác và thử hướng lựa chọn tiếp theo.
Khi đã thử hết tất cả các hướng lựa chọn xuất phát từ một điểm, ta quay lại điểmlựa chọn kế trước Quá trình tìm kiếm kết thúc khi không còn hướng lựa chọn nào
<Ghi nhận việc xi nhận giá trị t>;
<try(i+1)>; {th bước đi tiếp theo}
<Hủy bước đi thứ i (nếu cần)>;
Trang 3{Chuong trinh cai dat thuat toan de quy}
{Liet ke tat ca cac cau hinh nhi phan co do dai n}
for k:=1 to n do write(h[k]);
writeln;
endelseTry(i+1);
- Như vậy, việc xây dựng mỗi hoán vị được thực hiện qua n bước.
- Bước thứ i ta chọn một số trong tập {1, 2, …, n} để đặt vào vị trí thứ i của hoán vị.
- Tuy nhiên, ta chỉ chọn được số xi khi nó chưa được chọn cho các vị trítrước đó
Ta sử dụng mảng đánh dấu như sau:
Với ý nghĩa:
- KT[i] = True nếu i chưa được chọn
Trang 4- KT[i] = False nếu i đã được chọn{Chuong trinh cai dat thuat toan de quy}
{Liet ke tat ca cac hoan vi cua tap (1,2, ,n)}
for k:=1 to n do write(h[k],' ');
writeln;
endelseTry(i+1);
Trang 5- ứng cử viên xiđược chọn từ tập giá trị {xi-1+ 1, , n – (k-i)}
- nguyên tắc chọn trên giúp ta khỏi cần phải dánh dấu, bởi vì việc chọn giátrị tiếp theo phần tử đã được chọn trước đó nên sẽ không bị lặp lại
Chương trình
{chuong trinh de quy quay lui}
{liet ke tat ca cac to hop chap k cua tap n phan tu}
Chỉnh hợp lặp chập k của n phần tử là một dãy gồm k thành phần, mỗi thành phần
là một phần tử của tập n phần tử, không yêu cầu các thành phần là khác nhau và
có phân biệt thứ tự của các cấu hình
Ví dụ, một dãy nhị phân có độ dài 3 là một chỉnh hợp lặp chập 3 của tập 2 phần tử{0, 1} Các dãy nhị phân có độ dài 3:
000, 001, 010, 011, 100, 101, 111
Trang 6Vì có phân biệt thứ tự nên cấu hình 001 khác với 010.
Như vậy, cách tìm nghiệm của bài toán chỉnh hợp lặp như sau:
- Mỗi chỉnh hợp lặp chập k của tập n phần tử có dạng (x1, x2, …, xk).
- xilà một giá trị lấy trong tập {1, 2, …, n}
- không có ràng buộc nào giữa các thành phần
{chuong trinh de quy quay lui}
{liet ke tat ca cac chinh hop lap chap k cua n}
Một trường hợp đặc biệt của chỉnh hợp không lặp là hoán vị Hoán vị của một tập
n phần tử là chỉnh hợp không lặp chập n của n
Như vậy, cách tìm nghiệm của bài toán như sau:
- Mỗi nghiệm của bài toán là một dãy gồm k thành phần (x1, x2, …, xk)
Trang 7Page 6 of 84
Võ Văn Trị - CQB | Confidential
- Mỗi thành phần xilà một giá trị lấy trong tập {1, 2, …, n}
- Các giá trị đôi một khác nhau, để kiểm soát ràng buộc này, ta sử dụng mảng đánhdấu ok với ý nghĩa như sau:
Ok[j] = true có nghĩa rằng j sẽ chọn được
Ok[j] = false thì không chọn được, vì đã chọn j cho các vị trí trước đó
* Chương trình như sau:
{Chuong trinh de quy quay lui
liet ke tat ca cac chinh hop ko lap}
6 Bài tập 6: Bài toán xếp tám quân hậu
Một bàn cờ quốc tế là một bảng hình vuông gồm 8 hàng, 8 cột Quân hậu là mộtquân cờ có thể ăn được bất kỳ quân nào trên cùng một hàng, cùng một cột haymột đường chéo Hãy xếp tám quân hậu trên bàn cờ sao cho không có quân hậunào có thể ăn được quân hậu nào
Giải:
Trang 8- Theo bài toán, trên mỗi cột (j=1 8) của bàn cờ sẽ được đặt 1 quân hậu.
- Như vậy với mỗi cột ta phải tìm dòng thứ i nào đấy để đặt quân hậu vào Có
- Đường chéo song song với đường chéo phụ đi qua ô [i,j] chưa có hậu
- Khi đó, thủ tục try(j) thực hiện nhiệm vụ chọn dòng thứ i nào đấy để đặtquân hậu thứ j vào ô [i,j]
- Ta có thể minh họa một bàn cờ như sau:
Trang 9Page 8 of 84
Võ Văn Trị - CQB | Confidential
- Đánh dấu trạng thái các đường chéo // với đường chéo phụ
- Để lưu giữ kết quả, ta sử dụng mảng một chiều x
{Chuong trinh de quy quay lui
liet ke moi nghiem cua bai toan 8 quan hau}
Trang 107 Bài tập 7: Bài toán máy rút tiền tự động ATM
Một máy ATM hiện có n ( ≤ 20) tờ tiền có giá t1, t2, …, tn Hãy đưa ra một cách trảvới số tiền đúng bằng s
Nghiệm của bài toán là một dãy nhị phân độ dài n, trong đó thành phần thứ i bằng
1 nếu tờ tiền thứ i được sử dụng, bằng 0 trong trường hợp ngược lại (x1, x2, …, xn)
là nghiệm nếu 1 1+ 2 2+ ⋯ +
* Chương trình:
{Chuong trinh de quy quay lui
giai bai toan may rut tien tu dong ATM}
Program AtmSolution;
const
fi='atm.inp';
Trang 11if sum = s then ghinghiem;
if (sum<s)and(i<n) then atm(i+1);
if ok=true then exit;
Trang 12Cho bàn cờ n x n ô, tìm cách di chuyển một quân mã (mã di chuyển theo luật cờvua) trên bàn cờ xuất phát từ ô (1, 1) đi qua tất cả các ô, mỗi ô qua đúng 1 lần.
1.2 Số siêu nguyên tố (nguồn bài: Tài liệu giáo khoa chuyên tin Q1)
Số siêu nguyên tố là số nguyên tố mà khi bỏ bớt một số tùy ý các chữ số bên phảicủa nó thì phần còn lại vẫn là một số nguyên tố
Ví dụ 2333 là một số siêu nguyên tố có 4 chữ số vì 233, 23, 2 cũng là các sốnguyên tố Cho số nguyên dương N (0 < < 10), đưa ra các số siêu nguyên tố có
N chữ số cùng số các số đó
Ví dụ với N = 4 có 16 số:
2333, 2339, 2393, 2399, 2939, 3119, 3137, 3733, 3739, 3793, 3797, 5939, 7193,
7331, 7333, 7393
1.3 Chèn phép toán (nguồn bài: Tài liệu giáo khoa chuyên tin Q1)
Cho một xâu S chỉ gồm các ký tự từ ‘0’ đến ‘9’, độ dài nhỏ hơn 10 và số nguyên m,hãy đưa ra một cách chèn vào S các dấu ‘+’ hoặc ‘ -‘ để thu được số m cho trước(nếu có thể)
Ví dụ, M=8, S = ‘123456789’ thì một cách chèn là: ‘ -1+2-3+4+5-6+7-8+9’
1.4 Phân tích số (nguồn bài: Tài liệu giáo khoa chuyên tin Q1)
Cho n số nguyên dương a1, a2, …, an ( ≤ 10, ≤ 109) Tìm số nguyên dương mnhỏ nhất sao cho m không phân tích được dưới dạng tổng của một số các sốthuộc n số trên (mỗi số sử dụng không quá một lần)
D ữ liệu v ào K ết quả
n = 4
dãy số:
1, 2, 3, 6
13
Trang 13áp dụng để tìm nghiệm của bài toán tối ưu.
Giả sử nghiệm của bài toán có thể biểu diễn dưới dạng một véctơ (x1, x2, …, xn),mỗi thành phần xi(i = 1, 2, …, n) được chọn ra từ tập Si Mỗi nghiệm của bài toán X
= (x1, x2, …, xn) được xác định độ tốt bằng một hàm f(X) và mục tiêu cần tìmnghiệm X để f(X) đạt giá trị nhỏ nhất (hoặc lớn nhất)
Tư tưởng của phương pháp nhánh và cận như sau: Giả sử đã xây dựng được kthành phần của nghiệm (x1, x2, …, xk) và khi mở rộng nghiệm (x1, x2, …, xk+1), nếubiết rằng tất cả các nghiệm mở rộng của nó (x1, x2, …, xk+1, …) đều không tốt bằngnghiệm tốt nhất đã biết ở thời điểm trước đó, thì ta không cần mở rộng từ (x1, x2,
…, xk) nữa Như vậy, với phương pháp nhánh và cận, ta không phải duyệt toàn bộcác phương án để tìm ra nghiệm tốt nhất mà bằng cách đánh giá các nghiệm mở
rộng, ta có thể cắt bỏ những nhánh không cần thiết, do đó việc tìm nghiệm tối ưu
sẽ nhanh hơn Cái khó nhất trong việc áp dụng phương pháp nhánh và cận làđánh giá các nghiệm mở rộng, nếu đánh giá được tốt sẽ giúp bỏ qua được nhiềuphương án không cần thiết, khi đó thuật toán nhánh cận sẽ chạy nhanh hơn nhiều
so với thuật toán vét cạn
Thuật toán nhánh và cận có thể mô tả bằng mô hình đệ quy sau:
Procedure BranchBound(i); {xây dựng thành phần thứ i}
Trang 14mới tìm thấy tốt hơn BestSolution thì BestSolution sẽ được cập nhật lại là nghiệmmới tìm được.
1 Bài toán máy rút tiền tự động ATM
Output: Tệp ATM.OUT có dạng: Nếu có thể trả tiền đúng bằng S thì đưa ra số tờ ít
nhất cần trả và đưa ra cách trả, nếu không ghi -1
Như đã biết, nghiệm của bài toán là một dãy nhị phân có độ dài n, giả sử đã xâydựng được k thành phần (x1, x2, …,xk), đã trả được sum và sử dụng c tờ tiền Đểđánh giá các nghiệm mở rộng của (x1, x2, …,xk) ta nhận thấy:
Trang 16if xbest[j]=1 then write(f,t[j],' ');
2 Bài toán người du lịch
Bài toán: Cho n thành phố được đánh số từ 1 đến n và các tuyến đường giao
thông hai chiều giữa chúng, mạng lưới giao thông này được cho bởi mảng C[1 n,1 n], ở đây Cịj = Cji là chi phí đi đoạn đường trực tiếp từ thành phố i đến thànhphố j (hoặc ngược lại)
Một người du lịch xuất phát từ thành phố 1, muốn đi thăm tất cả các thành phốcòn lại mỗi thành phố đúng 1 lần và cuối cùng quay lại thành phố 1 Hãy chỉ ra chongười đó hành trình với chi phí ít nhất Bài toán được gọi là bài toán người du lịch
hay bài toán người chào hàng (Travelling Salesman Problem – TSP).
Ví dụ 2
Trang 171) Hành trình cần tìm có dạng (x1= 1, x2, …, xn, xn+1= 1), ở đây giữa xivà xi+1:hai thành phố liên tiếp trong hành trình phải có đường đi trực tiếp; trừthành phố 1, không thành phố nào được lặp lại hai lần, có nghĩa là dãy (x1,x2, …, xn) lập thành một hoán vị của (1, 2, …, n)
2) Duyệt quay lui: x2có thể chọn một trong các thành phố mà x1có đường đitrực tiếp tới, với mỗi cách thử chọn x2như vậy thì x3có thể chọn một trongcác thành phố mà x2có đường đi tới (ngoài x1) Tổng quát: xicó thể chọn 1trong các thành phố chưa đi qua mà xi-1 có đường đi trực tiếp tới(2 ≤ ≤ )
3) Nhánh cận: Khởi tạo cấu hình BestSolution có chi phí bằng +∞ Với mỗibước thử chọn xi xem chi phí đường đi cho tới lúc đó có nhỏ hơn chi phícủa cấu hình BestSolution không? Nếu không nhỏ hơn thì thứ giá trị khácngay bởi có đi tiếp cũng chỉ tốn thêm Khi thử được một giá trị xn ta kiểmtra xem xncó đường đi trực tiếp về 1 hay không? Nếu có đánh giá chi phí đi
từ thành phố 1 đến thành phố xn cộng với chi phí từ xntrực tiếp về 1, nếunhỏ hơn BestSolution thì cập nhật lại BestSolution bằng cách đi mới
Trang 192.1 Bài tập 4.15 (nguồn bài: Tài liệu giáo khoa chuyên tin Q1)
Lời giải bài toán người du lịch ở trên là một giải pháp nhánh cận rất thô sơ Nếuchạy chương trình với trường hợp: số thành phố n=20, khoảng cách giữa cácthành phố bằng 1 (nghĩa là c[i, j]=1 với i<>j) Khi đó chương trình không cho rađược kết quả vì độ phức tạp rất lớn 20!, không thể chạy trong thời gian cho phép
Ta nên cải tiến cách đánh giá như sau:
Để đi qua tất cả các thành phố, sau đó quay lại thành phố 1 ta phải đi qua n tuyếnđường (qua tổng cộng n+1 điểm, vì thành phố 1 được tính 2 lần) Giả sử ta đã xâydựng hành trình đi qua i thành phố với tổng chi phí là sum, ta gọi min là chi phícủa cạnh nhỏ nhất trong các cạnh chưa đi qua Nếu như sum + (n -i+1)*min
>=best thì ta không nên xây dựng tiếp hành trình từ thành xinữa mà nên quay lui
để chọn hướng đi khác để hi vọng có được hành trình tốt hơn
Để dễ dàng khi tìm min trong các cạnh chưa xét, ta xây dựng danh sách cạnh gồm
½ số cạnh nằm phía trên đường chéo chính (i<j) và sắp xếp theo thứ tự tăng dần
2.2 Bài tập 4.16 (nguồn bài: Tài liệu giáo khoa chuyên tin Q1)
Cho bàn cờ quốc tế 8 x 8 ô, mỗi ô ghi một số nguyên dương không vượt quá
32000 Hãy xếp 8 quân hậu lên bàn cờ sao cho không có quân nào khống chếđược quân nào và tổng các số ghi trên các ô mà quân hậu đứng là lớn nhất
Input: tệp gồm 8 dòng, mỗi dòng ghi 8 số nguyên dương, giữa các số cách nhau
một dấu cách
Output: tệp có một số duy nhất là đáp số của bài toán.
Trang 20Như đã biết, trên mỗi cột của bàn cờ chỉ đặt được một quân hậu Để tìm nghiệmbài toán, ta phải duyệt quay lui:
- Tại bước thứ i, ta chọn một dòng j nào đấy để đặt quân hậu thứ i vào (với điềukiện dòng j, đường chéo // với đường chéo chính, đường chéo // với đườngchéo phụ đi qua ô đó chưa được đặt một quân hậu nào)
- Tuy nhiên, nếu duyệt tất cả các phương án sau đó tìm cách đặt tốt nhất trong
92 cách đặt thì không khả thi vì chươn g trình sẽ không đảm bảo về mặt thờigian
- Giả sử tới bước thứ i, ta đã đặt được i quân hậu với tổng giá trị là sum Gọimax[k] là giá trị lớn nhất của các ô chưa bị kiểm soát trên các cột còn lại:
max[k] = max{dk+1, …, dn}
với dhlà giá trị lớn nhất của các ô chưa bị kiểm soát trên cột h
- Khi đó, nếu mở rộng nghiệm theo phương án này thì giá trị lớn nhất có thể đạtsum + max[k] * (n-i);
- Do vậy, nếu sum + max[k]*(n-i)<= BestSolution thì không cần mở rộng nghiệmtheo hướng này nữa
2.3 Xếp valy (nguồn bài: spoj)
Một va ly có thể chứa tối đa W đơn vị trọng lượng Có N loại đồ vật, số lượngmỗi loại không hạn chế Loại đồ vật thứ i có trọng lượng Ai và có giá trị Ci Hỏinên chọn những loại đồ vật nào và số lượng bao nhiêu để xếp vào va ly sao cho:
- Tổng trọng lượng của các vật không vượt quá giới hạn W của valy;
- Tổng giá trị của các vật là lớn nhất
Giải: Với mỗi loại đồ vật i, gọi Ti là giá trị riêng của nó: Ti = Ci / Ai Sau đó sắp các
loại đồ vật theo thứ tự giảm dần của Ti
Phương pháp duyệt nhánh cận tại mỗi bước duyệt loại đồ vật i, ta lấy k đồ vậtloạinày, khi đó điều kiện để duyệt tiếp loại đồ vật i+1 (điều kiện nhánh cận) là:
- k*Ai <= w
- s(i) + k*Ci + (w - k*Ai)*Ti+1 > smax
Trong đó:
- w là trọng lượng mà valy có thể chứa thêm sau bước duyệt loại đồ vật i-1;
- s(i) là tổng giá trị hiện đang có của valy sau bước duyệt loại đồ vật i-1;
- smax là tổng giá trị valy của một các xếp đã tìm được nhưng chưa tối ưu Cóthể khởi tạo smax ban đầu bằng 0
2 4 Xâu ABC
Tìm một xâu chỉ gồm các ký tự A,B,C sao cho
Trang 21Page 20 of 84
Võ Văn Trị - CQB | Confidential
- Có độ dài N cho trước (N<=1000)
- Hai đọan con bất kì liên nhau đều khác nhau (đoạn con là một dãy các ký tựliên tiếp của xâu)
- Có ít ký tự C nhất
Giải (thầy Lê Minh Hoàng):
Thuật toán 1: Ước lượng hàm cận
Ta sẽ dùng thuật toán quay lui để liệt kê các dãy n ký tự mà mỗi phần tử của dãyđược chọn trong tập {A, B, C} Giả sử cấu hình cần liệt kê có dạng x[1 n] thì:
Nếu dãy x[1 n] thoả mãn 2 đoạn con bất kỳ liền nhau đều khác nhau, thì trong 4 ký
tự liên tiếp bất kỳ bao giờ cũng phải có ít nhất một ký tự ‘C’ Như vậy với một đoạngồm k ký tự liên tiếp của dãy x[1 n] thì số ký tự ‘C’ trong đoạn đó luôn ≥ [4]
Sau khi thử chọn ∈ { , , , }, nếu ta đã có ký tự ‘C’ trong đoạn x[1 i], thì cho
dù các bước chọn tiếp sau làm tốt như thế nào chăng nữa, số ký tự ‘C’ phải chọnthêm không bao giờ ít hơn [ 4−] Tức là nếu theo phương án chọn như thế này thì
số ký tự ‘C’ trong dãy kết quả (khi chọn đến ) không thể ít hơn + [ 4−] Ta dùngcon số này để đánh giá nhánh cận, nếu nó nhiều hơn số ký tự ‘C’ trong cấu hình tốtnhất đang cho tới thời điểm hiện tại thì chắc chắn có làm tiếp cũng chỉ được mộtcấu hình tồi tệ hơn, ta bỏ qua ngay cách chọn này và thử phương án khác
Thuật toán này hoạt động khá nhanh với ≤ 100, tuy nhiên với những giá trị n lớnthì thời gian thực hiện vẫn tương đối lâu Dưới đây là một thuật toán tốt hơn, đi đôivới nó là một chiến lược chọn hàm cận hiệu quả hơn
Thuật toán 2: Lấy ngắn nuôi dài
Với mỗi độ dài m, ta gọi f[m] là số ký tự ‘C’ trong dãy thỏa hai đoạn con bất kỳ liềnnhau đều khác nhau và có ít ký tự C nhất Rõ ràng f[0] = 0, ta lập trình tính các f[m]khác với điều kiện là f[0 m-1] đã biết
Tương tự như thuật toán 1, ta giả sử cấu hình cần tìm có dạng x[1 m] thì sau khithử chọn xi, nếu ta đã có tiký tự ‘C’ trong đoạn x[1 i] thì dù cho các bước tiếp sau cólàm tốt thế nào đi chăng nữa, số ký tự ‘C’ chọn thêm sẽ không ít hơn f[m-i], tức lànếu chọn tiếp thì số ký tự ‘C’ sẽ không ít hơn + [ − ] Ta dùng cận này kết hợpvới thuật toán quay lui để tìm xâu tốiưu độ dài m
2.5 Tour du lịch rẻ nhất (TOUR)
Một khu thắng cảnh gồm n điểm đánh số từ 1
tới n (n ≤ 100) và m đường đi hai chiều giữa
các cặp địa điểm đó, chi phí đi trên các đường
đi là biết trước ( ≤ 10000) Một Tour du lịch là
một hành trình xuất phát từ một địa điểm đi
thăm ≥ 2 địa điểm khác và quay trở về điểm
xuất phát, ngoại trừ địa điểm xuất phát, không
địa điểm nào bị thăm tới hai lần Chi phí của một
Trang 22Tour du lịch là tổng chi phí các quãng đường đi qua.
Yêu cầu: Hãy tìm Tour du lịch có chi phí rẻ nhất.
Dữ liệu: TOUR.INP
- Dòng 1: Ghi hai số nguyên dương n, m
- m dòng tiếp theo mỗi dòng có dạng x y c Cho biết có đường đi trực tiếp nốiđịa điểm x với địa điểm y và chi phí đi quãng đường đó là c
Kết quả: TOUR.OUT
- Dòng 1: Ghi số 1 nếu như tồn tại hành trình theo yêu cầu, ghi số 0 nếu khôngtồn tại hành trình
Nếu dòng đầu tiên ghi số 1:
- Dòng thứ 2 ghi chi phí của tour tìm được
- Dòng thứ 3 ghi số k là số địa điểm tới thăm
- Dòng thứ 4 gồm k số, số thứ i là địa điểm tới thăm thứ i trong tour, quy ướcđịa điểm thăm đầu tiên là địa điểm xuất phát, địa điểm thăm thứ k (địađiểm cuối cùng) là địa điểm mà từ đó quay trở lại điểm xuất phát để kết thúchành trình
Các số trên một dòng của Input/Output File được ghi cách nhau ít nhất một dấucách
3 5 2 4 1
2.6 Robot cứu hỏa - VOI 2007 (QBROBOT)
Trên một mạng lưới giao thông có n nút, các nút được đánh số từ 1 đến n và giữahai nút bất kỳ có không quá một đường nối trực tiếp (đường nối trực tiếp là mộtđường hai chiều) Ta gọi đường đi từ nút s đến nút t là một dãy các nút và cácđường nối trực tiếp có dạng:
s = u1, e1, u2, , ui, ei, ui+1, , uk-1, ek-1, uk= t,trong đó u1, u2, …, uklà các nút trong mạng lưới giao thông, ei là đường nối trựctiếp giữa nút uivà ui+1(không có nút ujnào xuất hiện nhiều hơn một lần trong dãytrên, j = 1, 2, …, k)
Trang 23Yêu cầu: Hãy xác định giá trị w nhỏ nhất để robot đi được trên một đường đi từnút 1 đến nút n trong thời gian ít nhất.
Input
- Dòng đầu tiên chứa một số nguyên dương n (2 ≤ n ≤ 500);
- Dòng thứ hai chứa n số, trong đó số thứ j bằng 1 hoặc 0 tương ứng ở nút j
có hoặc không có trạm tiếp năng lượng (j = 1, 2, …, n);
- Dòng thứ ba chứa số nguyên dương m (m ≤ 30000) là số đường nối trựctiếp có trong mạng lưới giao thông;
- Dòng thứ k trong số m dòng tiếp theo chứa 4 số nguyên dương i, j, tij, cij(tij,cij ≤ 10000) mô tả đường nối trực tiếp từ nút i đến nút j, thời gian và chiphí năng lượng tương ứng
Hai số liên tiếp trên một dòng trong file dữ liệu cách nhau ít nhất một dấucách
2 7 ROADS (nguồn bài: spoj)
Có N thành phố 1 N nối bởi các con đường một chiều Mỗi con đường có hai giátrị: độ dài và chi phí phải trả để đi qua Bob ở thành phố 1 Bạn hãy giúp Bob tìm
Trang 24đường đi ngắn nhất đến thành phố N, biết rằng Bob chỉ có số tiền có hạn là K màthôi.
Dữ liệu
Dòng đầu tiên ghi t là số test Với mỗi test, dòng đầu ghi K (0 ≤ K ≤ 10000) Dòng
2 ghi N, 2 ≤ N ≤ 100 Dòng 3 ghi R, 1 ≤ R ≤ 10000 là số đường nối Mỗi dòng trong
N dòng sau ghi 4 số nguyên S, D, L, T mô tả một con đường nối giữa S và D với độdài L ( 1 ≤ L ≤ 100) và chi phí T (0 ≤ T ≤ 100) Lưu ý có thể có nhiều con đườngnối giữa hai thành phố
44
Trang 25Page 24 of 84
Võ Văn Trị - CQB | Confidential
Chuyên đề 3 Duyệt ưu tiên
1.Mã đi tuần
Cho bàn cờ tổng quát nxn và một quân mã (n ≤100) Hãy chỉ ra một hành trình
của mã xuất phát từ ô (x,y), đi qua tất cả các ô còn lại của bàn cờ, mỗi ô đúngmột lần (luật đi của mã như luật cờ vua)
Gợi ý: Nếu xem mỗi ô của bàn cờ là một đỉnh của đồ thị thì bài toán này tương
đương với bài toán tìm đường đi Haminton (đường đi qua tât cả các đỉnh vàqua mỗi đỉnh đúng một lần) Thuật toán duy nhất cho bài toán này là duyệt đệ quyquay lui
Tại mỗi bước duyệt, giả sử ta đang ở đỉnh u, từ đỉnh u ta ưu tiên đi sang đỉnh
v có cạnh nối với u mà bậc của v là nhỏ nhất (định nghĩa bậc của một đỉnh v là sốđỉnh nối với đỉnh v đó mà chưa được thăm)
Xét ví dụ trên hình, con mã đang đã đi được 4 bước và đang ở ô (7,G) Từ ônày con mã có thể nhảy đến 1 trong 3 ô tiếp theo là (6,E) - có bậc là 6; ô (5,F) -
có bậc là 7; hoặc ô (5,H) - có bậc là 3 Con mã sẽ ưu tiên nhảy ô có bậc nhỏ hơntrước - là ô (5,H)
Sự ưu tiên trong phương pháp duyệt trên giúp chương trình chạy nhanhhơn rất nhiều so với khi duyệt đơn thuần Tuy nhiên với trường hợp bài toán
vô nghiệm (không có đường đi Haminton) thì chương trình cũng chạy rất lâu vìphải duyệt qua hết toàn bộ không gian dữ liệu Do đó cần dùng thêm biến chặn thờigian để xử lý trường hợp này
2 Cặp điểm gần nhất
Trên mặp phẳng tạo độ cho N điểm phân biệt (N≤20000) Tìm 2 điểm màkhoảng cách giữa chúng là ngắn nhất
Gợi ý: Nếu duyệt thông thường, thuật toán mất O(N2) và chạy rất lâu với N lớn.
Sự ưu tiên trong phép duyệt sau đây giúp thuật toán chạy trong thời gian chophép và cho kết quả chính xác với phần lớn các test
Ta sắp xếp lại các điểm theo một tiêu chí nào đó có liên quan đến khỏang
Page 24 of 84
Võ Văn Trị - CQB | Confidential
Chuyên đề 3 Duyệt ưu tiên
1.Mã đi tuần
Cho bàn cờ tổng quát nxn và một quân mã (n ≤100) Hãy chỉ ra một hành trình
của mã xuất phát từ ô (x,y), đi qua tất cả các ô còn lại của bàn cờ, mỗi ô đúngmột lần (luật đi của mã như luật cờ vua)
Gợi ý: Nếu xem mỗi ô của bàn cờ là một đỉnh của đồ thị thì bài toán này tương
đương với bài toán tìm đường đi Haminton (đường đi qua tât cả các đỉnh vàqua mỗi đỉnh đúng một lần) Thuật toán duy nhất cho bài toán này là duyệt đệ quyquay lui
Tại mỗi bước duyệt, giả sử ta đang ở đỉnh u, từ đỉnh u ta ưu tiên đi sang đỉnh
v có cạnh nối với u mà bậc của v là nhỏ nhất (định nghĩa bậc của một đỉnh v là sốđỉnh nối với đỉnh v đó mà chưa được thăm)
Xét ví dụ trên hình, con mã đang đã đi được 4 bước và đang ở ô (7,G) Từ ônày con mã có thể nhảy đến 1 trong 3 ô tiếp theo là (6,E) - có bậc là 6; ô (5,F) -
có bậc là 7; hoặc ô (5,H) - có bậc là 3 Con mã sẽ ưu tiên nhảy ô có bậc nhỏ hơntrước - là ô (5,H)
Sự ưu tiên trong phương pháp duyệt trên giúp chương trình chạy nhanhhơn rất nhiều so với khi duyệt đơn thuần Tuy nhiên với trường hợp bài toán
vô nghiệm (không có đường đi Haminton) thì chương trình cũng chạy rất lâu vìphải duyệt qua hết toàn bộ không gian dữ liệu Do đó cần dùng thêm biến chặn thờigian để xử lý trường hợp này
2 Cặp điểm gần nhất
Trên mặp phẳng tạo độ cho N điểm phân biệt (N≤20000) Tìm 2 điểm màkhoảng cách giữa chúng là ngắn nhất
Gợi ý: Nếu duyệt thông thường, thuật toán mất O(N2) và chạy rất lâu với N lớn.
Sự ưu tiên trong phép duyệt sau đây giúp thuật toán chạy trong thời gian chophép và cho kết quả chính xác với phần lớn các test
Ta sắp xếp lại các điểm theo một tiêu chí nào đó có liên quan đến khỏang
Page 24 of 84
Võ Văn Trị - CQB | Confidential
Chuyên đề 3 Duyệt ưu tiên
1.Mã đi tuần
Cho bàn cờ tổng quát nxn và một quân mã (n ≤100) Hãy chỉ ra một hành trình
của mã xuất phát từ ô (x,y), đi qua tất cả các ô còn lại của bàn cờ, mỗi ô đúngmột lần (luật đi của mã như luật cờ vua)
Gợi ý: Nếu xem mỗi ô của bàn cờ là một đỉnh của đồ thị thì bài toán này tương
đương với bài toán tìm đường đi Haminton (đường đi qua tât cả các đỉnh vàqua mỗi đỉnh đúng một lần) Thuật toán duy nhất cho bài toán này là duyệt đệ quyquay lui
Tại mỗi bước duyệt, giả sử ta đang ở đỉnh u, từ đỉnh u ta ưu tiên đi sang đỉnh
v có cạnh nối với u mà bậc của v là nhỏ nhất (định nghĩa bậc của một đỉnh v là sốđỉnh nối với đỉnh v đó mà chưa được thăm)
Xét ví dụ trên hình, con mã đang đã đi được 4 bước và đang ở ô (7,G) Từ ônày con mã có thể nhảy đến 1 trong 3 ô tiếp theo là (6,E) - có bậc là 6; ô (5,F) -
có bậc là 7; hoặc ô (5,H) - có bậc là 3 Con mã sẽ ưu tiên nhảy ô có bậc nhỏ hơntrước - là ô (5,H)
Sự ưu tiên trong phương pháp duyệt trên giúp chương trình chạy nhanhhơn rất nhiều so với khi duyệt đơn thuần Tuy nhiên với trường hợp bài toán
vô nghiệm (không có đường đi Haminton) thì chương trình cũng chạy rất lâu vìphải duyệt qua hết toàn bộ không gian dữ liệu Do đó cần dùng thêm biến chặn thờigian để xử lý trường hợp này
2 Cặp điểm gần nhất
Trên mặp phẳng tạo độ cho N điểm phân biệt (N≤20000) Tìm 2 điểm màkhoảng cách giữa chúng là ngắn nhất
Gợi ý: Nếu duyệt thông thường, thuật toán mất O(N2) và chạy rất lâu với N lớn.
Sự ưu tiên trong phép duyệt sau đây giúp thuật toán chạy trong thời gian chophép và cho kết quả chính xác với phần lớn các test
Ta sắp xếp lại các điểm theo một tiêu chí nào đó có liên quan đến khỏang
Trang 26cách Chẳng hạn lấy thêm một điểm bất kì nằm ngoài tập điểm và sắp lại Nđiểm đã cho theo thứ tự tăng (giảm) dần khoảng cách đến điểm này Haysắp tăng (giảm) N điểm theo hoành độ x Hay sắp tăng (giảm) N điểm theo tung
độ y…
Sau khi sắp xếp như vậy, với mỗi điểm i, ta ưu tiên xét các điểm j trong khônggian lân cận với nó trước - tức là những điểm gần điểm i trong danh sách đãsắp xếp độ rộng của không gian lân cận (có thể gọi là không gian tìm kiếm) do
ta tự quy định, không gian xét càng rộng thì độ chính xác của chương trình càngcao nhưng thời gian chạy càng lâu
Ví dụ với N=20000 sau khi sắp xếp lại ta đươc dãy các điểm i1, i2, … , i20000.với mỗi điểm ik, nếu ta quy định không gian tìm kiếm là 100 thì ta chỉ xét khoảngcách của ik với các điểm ik+1, ik+2, …, ik+100
Việc sắp xếp các điểm và chọn không gian tìm kiếm hợp lý sẽ giúp chương trình có
độ tin cậy cao và chạy trong thời gian cho phép
Chú ý: Bài toán trên còn có thuật giải độ phức tạp NlogN tuy nhiên khá
phức tạp và không được nói ở đây
Bài tập luyện tập
3.1 Phòng cháy (FIRE)
Để đối phó với tình hình biến động của giá xăng dầu, nước X quyết định xâydựng một kho dự trữ dầu với quy mô cực lớn Kho chứa dầu sẽ bao gồm N bểchứa dầu hình trụ tròn mà ta sẽ biểu diễn trên bản đồ bằng N hình tròn, hìnhtròn thứ i có tọa độ là (Xi, Yi) và bán kính Ri, các hình tròn không có điểm chungtrong với nhau (nhưng có thể tiếp xúc)
Để đảm bảo an toàn phòng cháy chữa cháy, người ta cần xác định 2 bể chứa dầugần nhau nhất để tăng cường cách ly khi xảy ra hỏa hoạn
Biết rằng khoảng cách giữa 2 bể chứa dầu thứ i và thứ j chính bằng khoảng cáchgiữa 2 đường tròn tương ứng và bằng Dij - Ri - Rj, trong đó Dij là khoảng cáchgiữa 2 điểm (Xi, Yi) và (Xj, Yj)
Bạn hãy giúp những người quản lý tìm ra 2 bể chứa dầu này
Dữ liệu: FIRE.INP
- Dòng thứ nhất ghi số nguyên dương N là số bể chứa dầu
- Dòng thứ i trong N dòng tiếp theo ghi 3 số nguyên Xi, Yi, Ri là tọa độ và bánkính bể chứa dầu thứ i
Kết quả: FIRE.OUT
- Gồm 1 dòng duy nhất là khoảng cách của 2 bể chứa dầu bé nhất tìm được
Giới hạn:
Trang 28Chuyên đề 4 Tìm kiếm nhị phân
1 Dãy con tăng dài nhất (bản khó) - Mã bài: LIS
(Giống bài LIQ) Cho một dãy gồm N số nguyên (1 ≤ N ≤ 30000) Hãy tìm dãy contăng dài nhất trong dãy đó In ra số lượng phần tử của dãy con Các số trong phạm
vi longint
Input
- Dòng đầu tiên gồm số nguyên N
- Dòng thứ hai gồm N số mô tả dãy
2 Phân công hoàn thành sớm nhất - Mã bài: ASSIGN1
Có n người, n việc (1 < n ≤ 200) Người thứ i thực hiện công viêc j mất C[i,j] đơn vịthời gian Giả sử tất cả bắt đầu vào thời điểm 0, hãy tìm cách bố trí mỗi công việccho mỗi người sao cho thời điểm hoàn thành công việc là sớm nhất có thể
Trang 29Page 28 of 84
Võ Văn Trị - CQB | Confidential
Các bạn đã đọc bộ truyện tranh Nhật Bản Yugi-oh chắc hẳn ai cũng cực kì yêuthích trò chơi bài Magic Bộ bài và chiến thuật chơi quyết định đến sự thắng thuacủa đối thủ(mà sự thắng thua thì còn liên quan đến cả tính mạng >_<) Vì thế tầmquan trọng của bộ bài là rất lớn Một bộ bài tốt không chỉ bao gồm các quân bàimạnh mà còn phụ thuộc vào sự hỗ trợ tương tác giữa các quân bài Bộ bài củaYugi là một bộ bài có sự bổ sung, hỗ trợ cho nhau rất tốt, điều này là 1 trong cácnguyên nhân khiến Kaiba luôn là kẻ chiến bại
Tình cờ Kaiba đã tìm được 1 quân bài ma thuật mà chức năng của nó là chia bộbài hiện có của đối thủ ra làm K phần, mỗi phần có ít nhất 1 quân bài (điều nàylàm giảm sức mạnh của đối thủ) Kaiba quyết định áp dụng chiến thuật này vớiYugi Hiện tại Yugi có trong tay N quân bài, 2 quân bài i, j có sức mạnh tương táca(i,j) (a(i,j) = a(j,i)) Kaiba muốn chia các quân bài thành K phần theo quy tắc sau:
Giả sử K phần là P1, P2, ., Pk thì độ giảm sức mạnh giữa 2 phần u,v làb(u,v) = min(a(i,j) với i thuộc Pu, j thuộc Pv)
Độ giảm sức mạnh của bộ bài là S = min(b(u,v) với 1 ≤ u, v ≤ K)
Kaiba muốn chia K phần sao cho S lớn nhất
4 Mountain Walking - Mã bài: MTWALK
Cho một bản đồ kích thước NxN (2 <= N <= 100), mỗi ô mang giá trị là độ cao của
ô đó (0 <= độ cao <= 110) Bác John và bò Bessie đang ở ô trên trái (dòng 1, cột 1)
và muốn đi đến cabin (dòng N, cột N) Họ có thể đi sang phải, trái, lên trên vàxuống dưới nhưng không thể đi theo đường chéo Hãy giúp bác John và bò Bessietìm đường đi sao cho chênh lệch giữa điểm cao nhất và thấp nhất trên đường đi lànhỏ nhất
Dữ liệu
- Dòng 1: N
- Dòng 2 N+1: Mỗi dòng chứa N số nguyên, mỗi số cho biết cao độ của một ô
Trang 311 Các phép toán logic
Với 2 biến nguyên cùng kiểu a, b được thể hiện bởi dãy k bit:
:
:
a Phép đảo bit(not): đảo tất cả các bit từ 0 thành 1, 1 thành 0.
not(a) -> ta sẽ được số : với ci= 0 nếu ai= 1, ci= 1 nếu ai= 0
Ví dụ: not(10) = 245 (11110101);
Theo cách biểu diễn của số âm, ta có thể nhận thấy not(a) = -(a+1);
Ví dụ: not(-12) = 11 (1011)
b Phép cộng logic (or): thực hiện trên từng cặp bit của 2 số, kết quả bằng 0 khi cả 2
bit đều bằng 0, còn lại bằng 1:
bit a i bit b i a i or b i
Trang 320 0 0
c Phép nhân logic (and): thực hiện trên từng cặp bit của 2 số, kết quả bằng 1 khi cả 2
bit đều bằng 1, còn lại bằng 0:
bit a i bit b i a i and b i
a) Phép dịch trái(shl – shift left):
Ý nghĩa: dịch dãy bit biểu diễn số nguyên a sang trái k vị trí, các vị trí bị dịch đi được
thay bằng bit 0, các bit ra khỏi phạm vi xem như không xuất hiện trong dãy mới
b) Phép dịch phải(shr – shift right):
Ý nghĩa: dịch dãy bit biểu diễn số nguyên a sang phải k vị trí, các vị trí bị dịch đi được
thay bằng bit 0, các bit ra khỏi phạm vi xem như không xuất hiện trong dãy mới
3 Một số thao tác xử lý bit
a Hàm cho ra bit thứ i của số nguyên n
b Hàm cho ra số nguyên m tạo ra bằng cách lấy k bit, bit thứ i đến bít thứ j của số nguyên n
function getbit(n:int; i:byte):byte;
begin
getbit := (n shr i) and 1;
end;
Trang 33Page 32 of 84
Võ Văn Trị - CQB | Confidential
c Thủ tục bật bit thứ i của số nguyên n (gán giá trị 1 cho bit thứ i):
d Thủ tục tắt bit thứ i của số nguyên n (gán giá trị 0 cho bit thứ i):
- Dòng đầu tiên ghi giá trị N
- N dòng tiếp theo, mỗi dòng ghi một số trong dãy N số
Trang 34là số chẵn: Cột 1 bỏ chữ số 1, Cột 2 bỏ chữ số 2 và 9, …Sau khi bỏ, các cột còn lạichữ số có số lần xuất hiện là một số lẻ chính là số đặc biệt cần tìm.
Cụ thể, ta sử dụng một mảng 2 chiều có kích thước 6 × 10 để ghi số lần xuất hiệncủa các chữ số trên mỗi cột:
Trang 35Page 34 of 84
Võ Văn Trị - CQB | Confidential
Ta cũng sử dụng tư tưởng trên nhưng không tách riêng các số ra Ta biết rằng mọi
số kiểu word đều sử dụng 16 bit để biểu diễn Ta sử dụng phép XOR để loại trừnhững bit có số lần xuất hiện là số chẵn Những bit còn lại là của số đặc biệt cầntìm
2 Bàn cờ thế (CHESSCBG)
Một bàn cờ thế là một bảng gồm 4 dòng, 4 cột Mỗi thế cờ là một cách sắp xếp
8 quân cờ, hai quân khác nhau ở hai ô khác nhau Bài toán đặt ra là cho hai thế
cờ 1 và 2, hãy tìm một số ít nhất bước di chuyển quân để chuyển từ thế 1 sangthế 2; một bước di chuyển quân là một lần chuyển quân cờ sang ô trống kề cạnh với
Giải: Mã hóa mỗi trạng thái bàn cờ bằng 1 dãy nhị phân 16 bit tương ứng.
Sử dụng phương pháp loang để tìm đường đi ngắn nhất từ trạng thái đầu về trạngthái cuối
Bài tập luyện tập
5.1 Mê cung (MECUNG)
Một mê cung hình chữ nhật gồm M dòng và N cột ô vuông, M,N <= 100 Các dòng(cột) đánh số từ 1 đên M ( từ 1 đến N) từ trên xuống (từ trái qua phải) Mộtrobot đứng ở ô (X,Y) Từ một ô bất kì, robot có thể di chuyển đến 1 trong 4 ô
kề cạnh Mỗi ô của mê cung ứng với 1 số trong phạm vi 0 15 với ý nghĩa quyđịnh những hướng robot có thể di chuyển đến Mỗi hướng được quy định bởi
1 số hiệu: Trên: 1; Dưới: 2; Phải: 4; Trái: 8 Giá trị của ô bằng tổng các số hiệu cáchướng mà robot có thể di chuyển đến VD ô (2,3) có giá trị 13 = 1 + 4 + 8 có nghĩa
Trang 36là từ ô (2,3) có thể di chuyển theo hướng trên, phải hay trái để sang ô kề cạnh tiếptheo.
Yêu cầu: Tìm đường đi ngắn nhất để robot có thể thoát ra được mê cung.
Dữ liệu: MECUNG.INP
- Dòng đầu tiên ghi 4 số M,N,X,Y
- Tiếp theo ma trận số M dòng, mỗi dòng N cột biểu diễn thông tin về mê cung
Giá vé máy bay từ đất nước i đến đất nước j là Cij (dĩ nhiên Cij có thể khácCji) Tuy được bố thưởng cho nhiều tiền để đi du lịch nhưng sherry cũng muốntìm cho mình 1 hành trình với chi phí rẻ nhất có thể để dành tiền mua quà
về tặng mọi người (Các chuyến bay của sherry đều được đảm bảo an toàn tuyệtđối )
Bạn hãy giúp sherry tìm 1 hành trình đi qua tất cả các nước, mỗi nước đúng 1lần sao cho chi phí là bé nhất nhé
Gợi ý: Gọi F[i,x] là chi phí ngắn nhất khi đang ở đất nước i và các đất nước đã
đi qua được đánh dấu bằng dãy bit của biến x Sử dụng tư tưởng quy hoạch độnggiải quyết
Trang 37Tư tưởng của phương pháp quy hoạch động là sử dụng một bảng để lưu giữ lời giải của các bài toán con đã được giải Khi giải một bài toán cần đến nghiệm của bài toán con nhỏ hơn, ta chỉ cần lấy lời giải ở bảng mà không cần phải giải lại Quy hoạch động tránh tính toán lại mọi thứ hai lần chính vì thế mà
các thuật toán được thiết kế bằng quy hoạch động sẽ rất hiệu quả
Để giải một bài toán bằng phương pháp quy hoạch động, chúng ta cần tiến hànhnhững công việc sau:
- Tìm nghiệm của bài toán con nhỏ nhất
- Tìm ra công thức xây dựng nghiệm của bài toán lớn thông qua nghiệm củacác bài toán con nhỏ hơn
- Tạo ra một bảng lưu giữ các nghiệm của các bài toán con
- Từ các bài toán con đã giải ta tìm nghiệm của bài toán tổng quát
KL: Quy hoạch động bắt đầu với những trường hợp con nhỏ nhất (thường là đơn giản và giải được ngay ) Bằng cách tổ hợp các kết quả đã có (không phải tính lại)
của các trường hợp con, sẽ đạt tới kết quả của trường hợp có kích thước lớn hơn
và tổng quát hơn, cho đến khi đạt được kết quả cuối cùng ( lời giải).
Chuyên đề 6 Quy hoạch động cơ bản
1 Cửa hàng bán hoa (IOI 1999)
Bạn muốn sắp đặt cửa sổ hiệu bán hoa của mình sao cho hấp dẫn nhất Bạn cóf
sẵn thành một hàng trên cửa sổ Các bình hoa được gắn cố định và được đánh sốliên tục từ 1 đến V, trong đó V là số bình, theo thứ tự từ trái sang phải sao chobình 1 là bên trái nhất còn bình V là bên phải nhất Mỗi bó hoa được cắm gán một
số nguyên duy nhất có giá trị trong khoảng từ 1 đến f và có thể cắm vào các bìnhkhác nhau Số hiệu của bó hoa có ý nghĩa như sau: bó hoa i phải nằm bên trái bó
là 1), một bó hoa thu hải đường (có số hiệu là 2) và một bó hoa cẩm chướng (có
số hiệu 3) Bây giờ, tất cả các bó hoa phải được cắm vào dãy các bình hoa sao chobảo đảm ràng buộc về thứ tự số hiệu Bó hoa đỗ quyên phải được cắm vào bìnhphía bên trái bó hoa thu hải đường, bó hoa thu hải đường phải được cắm vào bêntrái của bình hoa cẩm chướng Nếu số bình hoa nhiều hơn số bó hoa thì nhữngbình không dùng tới sẽ để trống Mỗi bình chỉ được cắm một bó hoa
Trang 38Mỗi bình hoa có đặc điểm khác nhau Vì vậy, khi một bó hoa được cắm vào
giá trị thẩm mĩ được cho trong bảng dưới đây:
Dữ liệu: từ tệp văn bản FLOWER.INP có cấu trúc:
- Dòng 1: ghi hai số nguyên f và v;
- f dòng tiếp theo: mỗi dòng chứa v số nguyên sao cho aijlà số thứ j trên dòngthứ i+1
Kết quả: ghi vào tệp văn bản FLOWER.OUT có cấu trúc:
- Dòng 1: ghi tổng giá trị thẩm mĩ của phương án cắm hoa tối ưu;
- Dòng 2: biểu diễn cách cắm là danh sách f số, sao cho số ở vị trí thứ k trongdanh sách này cho biết số hiệu bình hoa
Trang 39Page 38 of 84
Võ Văn Trị - CQB | Confidential
Giải: Gọi S[i, j] là tổng giá trị thẩm mĩ khi cắm i bó hoa (1 i) vào j bình (1 j):
− Nếu i > j (số bó hoa nhiều hơn số bình): không có cách cắm => s[i, j] = 0;
− Nếu i = j (số bó hoa = số bình): chỉ có một cách cắm duy nhất, bó hoa có sốhiệu nào cắm vào bình có số hiệu ấy => s[i, j] = ∑a[i, j];
− Nếu i < j (số bó hoa ít hơn số bình): ta xét hai trường hợp, bình cuối cùng j cóthể được cắm bó hoa cuối cùng i hoặc không
+ Nếu bó hoa i cắm bình j thì s[i, j] = s[i-1, j-1] + a[i, j];
+ Nếu bó hoa i không cắm vào bình j thì s[i, j] = s[i, j-1];
=> Nếu i < j: s[i, j] = max{ s[i-1, j-1] + a[i, j], s[i, j-1] }
2 Mua vé tàu hoả - Mã bài: QBTICKET
Tuyến đường sắt từ thành phố A đến thành phố B đi qua một số nhà ga Tuyếnđường có thể biểu diễn bởi một đoạn thẳng, các nhà ga là các điểm trên đó Tuyếnđường bắt đầu từ A và kết thúc ở B, vì thế các nhà ga sẽ được đánh số bắt đầu từ
Vé để đi thẳng từ nhà ga này đến nhà ga khác chỉ có thể đặt mua nếu khoảng cáchgiữa chúng không vượt quá L3 Vì thế nhiều khi để đi từ nhà ga này đến nhà gakhác ta phải đặt mua một số vé Hơn thế nữa, nhân viên đường sắt yêu cầu hànhkhách chỉ được giữ đúng một vé khi đi trên tàu và vé đó sẽ bị huỷ khi hành kháchxuống tàu
Yêu cầu: Tìm cách đặt mua vé để đi lại giữa hai nhà ga cho trước với chi phí mua
vé là nhỏ nhất
Input
- Dòng đầu tiên ghi các số nguyên L1, L2, L3, C1, C2, C3 (1 <= L1 <= L2 <= L3 <=
109; 1 <= C1 <= C2 <= C3 <= 109) theo đúng thứ tự liệt kê ở trên
- Dòng thứ hai chứa số lượng nhà ga N ( 2 <= N <= 100000 )
Trang 40- Dòng thứ ba ghi hai số nguyên s, f là các chỉ số của hai nhà ga cần tìm cách đặtmua vé với chi phí nhỏ nhất để đi lại giữa chúng.
- Dòng thứ i trong số N - 1 dòng tiếp theo ghi số nguyên là khoảng cách từ nhà
o Mảng [1 .3]: lưu 3 loại giá vé c1, c2, c3
- Gọi [ ] là chi phí tốt nhất để đi từ ga s tới ga i => kết quả của bài toán là[ ]