M T S BÀI TOÁN Ộ Ố
M T S BÀI TOÁN Ộ Ố
QUY HO CH Đ NGẠ Ộ
QUY HO CH Đ NGẠ Ộ
GVHD:
GVHD:
TS. Hoàng Quang
TS. Hoàng Quang
Nhóm thực hiện:
Nhóm thực hiện:
Nhóm 3:
Nhóm 3:
Lê Quốc Hải.
Lê Quốc Hải.
Nguyễn Đình Quý.
Nguyễn Đình Quý.
Hồ Hữu Linh.
Hồ Hữu Linh.
Hoàng Nguyễn Tuấn Minh.
Hoàng Nguyễn Tuấn Minh.
I. BÀI TOÁN “CÂY TÌM Ki M NH Ế Ị
I. BÀI TOÁN “CÂY TÌM Ki M NH Ế Ị
PHÂN T I U”Ố Ư
PHÂN T I U”Ố Ư
1.
1.
Đặt vấn đề:
Đặt vấn đề:
Giả sử cần phải dịch một đoạn văn bản gồm n từ
Giả sử cần phải dịch một đoạn văn bản gồm n từ
từ tiếng Anh sang tiếng Việt. Với mỗi từ
từ tiếng Anh sang tiếng Việt. Với mỗi từ
tiếng Anh trong văn bản, ta cần tìm một từ
tiếng Anh trong văn bản, ta cần tìm một từ
tiếng Việt tương ứng.
tiếng Việt tương ứng.
Một trong những cách thực hiện việc tìm kiếm
Một trong những cách thực hiện việc tìm kiếm
này là xây dựng một cây nhị phân tìm kiếm
này là xây dựng một cây nhị phân tìm kiếm
với n từ tiếng Anh như là các khóa và n từ
với n từ tiếng Anh như là các khóa và n từ
tiếng Việt tương ứng là dữ liệu.
tiếng Việt tương ứng là dữ liệu.
Có rất nhiều cách sắp xếp các khóa trên cây để tạo
Có rất nhiều cách sắp xếp các khóa trên cây để tạo
nên một cấu trúc cây và với mỗi cây sẽ cần một chi
nên một cấu trúc cây và với mỗi cây sẽ cần một chi
phí khác nhau khi tìm kiếm các khóa trên cây.
phí khác nhau khi tìm kiếm các khóa trên cây.
Chi phí tìm kiếm càng cao khi nút cần tìm càng nằm
Chi phí tìm kiếm càng cao khi nút cần tìm càng nằm
xa gốc (cây càng nhiều nút, độ sâu nút cần tìm càng
xa gốc (cây càng nhiều nút, độ sâu nút cần tìm càng
lớn). Đặc biệt, khi từ khóa cần tìm không có trong
lớn). Đặc biệt, khi từ khóa cần tìm không có trong
cây, chi phí tìm kiếm sẽ rất lớn.
cây, chi phí tìm kiếm sẽ rất lớn.
?. Bằng cách nào để có thể tổ chức một cây tìm kiếm
?. Bằng cách nào để có thể tổ chức một cây tìm kiếm
nhị phân mà chi phí tìm kiếm trên cây là thấp nhất.
nhị phân mà chi phí tìm kiếm trên cây là thấp nhất.
Ví d : Xét hai cây nh phân tìm ụ ị
Ví d : Xét hai cây nh phân tìm ụ ị
ki mế
ki mế
i
i
0
0
1
1
2
2
3
3
4
4
5
5
p
p
i
i
0.15
0.15
0.10
0.10
0.05
0.05
0.10
0.10
0.20
0.20
q
q
i
i
0.05
0.05
0.10
0.10
0.05
0.05
0.05
0.05
0.05
0.05
0.10
0.10
Trong đó, p
Trong đó, p
i
i
là xác suất để duyệt đỉnh có khóa là k
là xác suất để duyệt đỉnh có khóa là k
i
i
, q
, q
i
i
là xác suất để duyệt đỉnh có khóa
là xác suất để duyệt đỉnh có khóa
giả là d
giả là d
i
i
.
.
(a) Cây nhị phân tìm kiếm với chi phí là 2.80. (b) Cây nhị phân tìm kiếm với chi phí là
(a) Cây nhị phân tìm kiếm với chi phí là 2.80. (b) Cây nhị phân tìm kiếm với chi phí là
2.75. Hai cây tìm kiếm trên là tối ưu.
2.75. Hai cây tìm kiếm trên là tối ưu.
k
2
k
1
k
4
k
3
k
5
d
0
d
1
d
2
d
3
d
5
d
4
k
2
k
1
k
5
k
4
k
3
d
0
d
1
d
2
d
3
d
5
d
4
(a)
(b)
2. Phát bi u bài toán:ể
2. Phát bi u bài toán:ể
Cho một tập K = {k
Cho một tập K = {k
1
1
, k
, k
2
2
, …, k
, …, k
n
n
} là n khóa khác
} là n khóa khác
nhau đã được sắp, trong đó k
nhau đã được sắp, trong đó k
1
1
<k
<k
2
2
<…<k
<…<k
n
n
, và ta
, và ta
cần xây dựng một cây nhị phân tìm kiếm từ
cần xây dựng một cây nhị phân tìm kiếm từ
các khóa này sao cho chi phí tìm kiếm là thấp
các khóa này sao cho chi phí tìm kiếm là thấp
nhất.
nhất.
Các thu t ng , t khóa, khái ni m ậ ữ ừ ệ
Các thu t ng , t khóa, khái ni m ậ ữ ừ ệ
s d ng trong gi i thu t.ử ụ ả ậ
s d ng trong gi i thu t.ử ụ ả ậ
Mỗi khóa k
Mỗi khóa k
i
i
có xác suất tìm kiếm là p
có xác suất tìm kiếm là p
i
i
.
.
Có những trường hợp từ một khóa k
Có những trường hợp từ một khóa k
i
i
nào đó không
nào đó không
có trong cây, ta sử dụng các khóa giả d
có trong cây, ta sử dụng các khóa giả d
i
i
để đón nhận
để đón nhận
các giá trị này, với cây có n khóa k
các giá trị này, với cây có n khóa k
1
1
, k
, k
2
2
, …, k
, …, k
n
n
thì sẽ
thì sẽ
có n+1 khóa giả d
có n+1 khóa giả d
0
0
, d
, d
1
1
, …, d
, …, d
n
n
. Trong đó:
. Trong đó:
d
d
0
0
tương ứng cho tất cả các giá trị nhỏ hơn k
tương ứng cho tất cả các giá trị nhỏ hơn k
1
1
,
,
d
d
n
n
tương ứng cho tất cả các giá trị lớn hơn k
tương ứng cho tất cả các giá trị lớn hơn k
n
n
,
,
và với i = 1, …, n-1 thì khóa giả d
và với i = 1, …, n-1 thì khóa giả d
i
i
tương ứng cho giá trị
tương ứng cho giá trị
nằm giữa k
nằm giữa k
i
i
và k
và k
i+1
i+1
.
.
Với mỗi khóa giả d
Với mỗi khóa giả d
i
i
, chúng ta có một xác suất tìm
, chúng ta có một xác suất tìm
kiếm là q
kiếm là q
i
i
. Ta có:
. Ta có:
∑ ∑
= =
=+
n
i
n
i
ii
qp
1 0
1
Công thức tính chi phí cho một cây tìm kiếm nhị
Công thức tính chi phí cho một cây tìm kiếm nhị
phân như sau:
phân như sau:
∑ ∑
= =
+++=
n
i
n
i
iiTiiT
qddepthpkdepthseachE
1 0
).1)(().1)((T]in cost [
∑ ∑
= =
++=
n
i
n
i
iiTiiT
qddepthpkdepth
1 0
).().(1
Trong ví dụ đã cho ở cây (a), chúng ta có thể tính chi phí tìm kiếm tất cả các nút như sau:
Trong ví dụ đã cho ở cây (a), chúng ta có thể tính chi phí tìm kiếm tất cả các nút như sau:
Node
Node
depth
depth
probability
probability
contribution
contribution
K
K
1
1
1
1
0.15
0.15
0.30
0.30
K
K
2
2
0
0
0.10
0.10
0.10
0.10
K
K
3
3
2
2
0.05
0.05
0.15
0.15
K
K
4
4
1
1
0.10
0.10
0.20
0.20
K
K
5
5
2
2
0.20
0.20
0.60
0.60
D
D
0
0
2
2
0.05
0.05
0.15
0.15
D
D
1
1
2
2
0.10
0.10
0.30
0.30
D
D
2
2
3
3
0.05
0.05
0.20
0.20
D
D
3
3
3
3
0.05
0.05
0.20
0.20
D
D
4
4
3
3
0.05
0.05
0.20
0.20
D
D
5
5
3
3
0.10
0.10
0.40
0.40
Total
Total
2.80
2.80
k
2
k
1
k
4
k
3
k
5
d
0
d
1
d
2
d
3
d
5
d
4
(a)
Với ví dụ đã cho, ta tính được cây (a) có chi
Với ví dụ đã cho, ta tính được cây (a) có chi
phí tìm kiếm là 2.80, cây (b) có chi phí tìm
phí tìm kiếm là 2.80, cây (b) có chi phí tìm
kiếm là 2.75.
kiếm là 2.75.
Ta sẽ xây dựng một giải thuật để xây dựng
Ta sẽ xây dựng một giải thuật để xây dựng
một cây nhị phân tìm kiếm tối ưu với chi phí
một cây nhị phân tìm kiếm tối ưu với chi phí
tìm kiếm là thấp nhất từ một tập n khóa cho
tìm kiếm là thấp nhất từ một tập n khóa cho
trước, bằng cách xây dựng dần các cây con từ
trước, bằng cách xây dựng dần các cây con từ
khóa k
khóa k
i
i
đến khóa k
đến khóa k
j
j
. Sử dụng phương pháp Quy
. Sử dụng phương pháp Quy
hoạch động để giải quyết bài toán.
hoạch động để giải quyết bài toán.
4. Các b c gi i bài toán:ướ ả
4. Các b c gi i bài toán:ướ ả
Bước 1: Mô tả cấu trúc cây nhị phân tìm kiếm với các
Bước 1: Mô tả cấu trúc cây nhị phân tìm kiếm với các
khóa k
khóa k
i
i
, …, k
, …, k
j
j
Chọn một trong các khóa này là k
Chọn một trong các khóa này là k
r
r
(i ≤ r ≤ j), sẽ là gốc
(i ≤ r ≤ j), sẽ là gốc
của cây con tối ưu chứa các khóa đã cho. Các cây con
của cây con tối ưu chứa các khóa đã cho. Các cây con
bên trái của gốc k
bên trái của gốc k
r
r
sẽ chứa các khóa k
sẽ chứa các khóa k
i
i
, …, k
, …, k
r-1
r-1
(và các
(và các
khóa giả d
khóa giả d
i-1
i-1
, …, d
, …, d
r-1
r-1
), và cây con bên phải chứa các
), và cây con bên phải chứa các
khóa k
khóa k
r+1
r+1
, …, k
, …, k
j
j
(và các khóa giả d
(và các khóa giả d
r
r
, …, d
, …, d
j
j
). Cũng như
). Cũng như
vậy ta kiểm tra tất cả các gốc k
vậy ta kiểm tra tất cả các gốc k
r
r
, (i ≤ r ≤ j) .
, (i ≤ r ≤ j) .
Nếu khóa k
Nếu khóa k
i
i
có cây con trái rỗng thì cây con trái sẽ bao
có cây con trái rỗng thì cây con trái sẽ bao
gồm một nút lá là d
gồm một nút lá là d
i-1
i-1
, nếu khóa k
, nếu khóa k
j
j
có cây con phải rỗng
có cây con phải rỗng
thì cây con phải sẽ bao gồm một nút lá là khóa giả d
thì cây con phải sẽ bao gồm một nút lá là khóa giả d
j.
j.
B c 2: Gi i pháp đ quy:ướ ả ệ
B c 2: Gi i pháp đ quy:ướ ả ệ
Gọi e[i,j] là bảng chứa các chi phí tìm kiếm trên
Gọi e[i,j] là bảng chứa các chi phí tìm kiếm trên
cây nhị phân tìm kiếm tối ưu với các khóa k
cây nhị phân tìm kiếm tối ưu với các khóa k
i
i
,
,
…, k
…, k
j
j
.
.
W(i,j) là tổng xác suất trong cây nhị phân tìm
W(i,j) là tổng xác suất trong cây nhị phân tìm
kiếm tối ưu chứa khóa k
kiếm tối ưu chứa khóa k
i
i
, …, k
, …, k
j
j
.
.
Các trường hợp xảy ra:
Các trường hợp xảy ra:
Khi j = i – 1. Khi đó ta có khóa giả d
Khi j = i – 1. Khi đó ta có khóa giả d
i-1
i-1
.
.
- Chi phí tìm kiếm là e[i,i-1] = q
- Chi phí tìm kiếm là e[i,i-1] = q
i-1
i-1
;
;
- Tổng xác suất: w(i,i-1) = q
- Tổng xác suất: w(i,i-1) = q
i-1
i-1
với 1 ≤ i ≤ n+1.
với 1 ≤ i ≤ n+1.
Khi j ≥ i, chúng ta cần chọn một gốc k
Khi j ≥ i, chúng ta cần chọn một gốc k
r
r
từ các khóa k
từ các khóa k
i
i
, …, k
, …, k
j
j
,
,
sau đó xây dựng một cây nhị phân tìm kiếm tối ưu với các
sau đó xây dựng một cây nhị phân tìm kiếm tối ưu với các
khóa k
khóa k
i
i
, …, k
, …, k
r-1
r-1
là cây con trái của k
là cây con trái của k
r
r
và cây nhị phân tìm kiếm
và cây nhị phân tìm kiếm
tối ưu với các khóa k
tối ưu với các khóa k
r+1
r+1
, …, k
, …, k
j
j
là cây con phải của k
là cây con phải của k
r
r
.
.
Khi đó ta có:
Khi đó ta có:
=> w[i,j] = w[i,j-1] + p
=> w[i,j] = w[i,j-1] + p
j
j
+ q
+ q
j
j
Và:
Và:
e[i,j] = p
e[i,j] = p
r
r
+ (e[i,r-1] + w(i,r-1)) + (e[r+1,j] + w(r+1,j))
+ (e[i,r-1] + w(i,r-1)) + (e[r+1,j] + w(r+1,j))
=> e[i,j] = e[i,r-1] + e[r+1,j] + w(i,j)
=> e[i,j] = e[i,r-1] + e[r+1,j] + w(i,j)
∑∑
−==
+=
j
il
l
j
il
l
qpjiw
1
),(
Từ đó, ta có công thức đệ qui như sau:
Từ đó, ta có công thức đệ qui như sau:
+++−
=
≤≤
−
)},(],1[]1,[{min
],[
1
jiwjrerie
q
jie
jri
i
N u j = i – 1,ế
N u i ≤ jế
++−
=
−
jj
i
qpjiw
q
jiw
)1,(
),(
1
N u j = i – 1,ế
N u i ≤ jế
B c 3: Tính toán chi phí tìm ki m ướ ế
B c 3: Tính toán chi phí tìm ki m ướ ế
c a cây tìm ki m nh phân t i u:ủ ế ị ố ư
c a cây tìm ki m nh phân t i u:ủ ế ị ố ư
(L p b ng)ậ ả
(L p b ng)ậ ả
Ở bước này, ta sử dụng thêm bảng:
Ở bước này, ta sử dụng thêm bảng:
Root[i,j]: để lưu giữ các chỉ số r của khóa k
Root[i,j]: để lưu giữ các chỉ số r của khóa k
r
r
được
được
chọn làm gốc của các cây con chứa các khóa k
chọn làm gốc của các cây con chứa các khóa k
i
i
, …,
, …,
k
k
j
j
.
.
Thủ tục OPTIMAL-BST:
Thủ tục OPTIMAL-BST:
Input:
Input:
p
p
1
1
, p
, p
2
2
, …, p
, …, p
n
n
và q
và q
0
0
, …, q
, …, q
n
n
, kích thước n.
, kích thước n.
Output:
Output:
mảng e và root.
mảng e và root.
1
1
OPTIMAL-BST(p,q,n)
OPTIMAL-BST(p,q,n)
2
2
For
For
i
i
1
1
to
to
n+1
n+1
3
3
Do
Do
e[i, i-1]
e[i, i-1]
qi-1
qi-1
4
4
W[i,i-1]
W[i,i-1]
qi-1
qi-1
5
5
For
For
l
l
1
1
to
to
n
n
6
6
Do For
Do For
i
i
1
1
to
to
n – l + 1
n – l + 1
7
7
Do
Do
j
j
i + l – 1
i + l – 1
8
8
E[i,j]
E[i,j]
∞
∞
9
9
W[i,j]
W[i,j]
w[i,j-1] + pj + qj
w[i,j-1] + pj + qj
10
10
For
For
r
r
i
i
to
to
j
j
11
11
Do
Do
t
t
e[i,r-1] + e[r+1,j] + w[i,j]
e[i,r-1] + e[r+1,j] + w[i,j]
12
12
If
If
t < e[i,j]
t < e[i,j]
13
13
Then
Then
e[i,j]
e[i,j]
t
t
14
14
Root[i,j]
Root[i,j]
r
r
15
15
Return
Return
e
e
and
and
root
root
Ví d : Xét hai cây nh phân tìm ụ ị
Ví d : Xét hai cây nh phân tìm ụ ị
ki mế
ki mế
Ví dụ: Quay trở lại bài toán ban đầu đã đặt ra, cho tập
Ví dụ: Quay trở lại bài toán ban đầu đã đặt ra, cho tập
5 khóa k
5 khóa k
i
i
, i=1 5, khi đó để xây dựng cây nhị phân tìm
, i=1 5, khi đó để xây dựng cây nhị phân tìm
kiếm tối ưu ta cần bổ sung các khóa giả d
kiếm tối ưu ta cần bổ sung các khóa giả d
j
j
, j = 0 n; và
, j = 0 n; và
xác suất tìm kiếm các khóa và khóa giả là:
xác suất tìm kiếm các khóa và khóa giả là:
i
i
0
0
1
1
2
2
3
3
4
4
5
5
p
p
i
i
0.15
0.15
0.10
0.10
0.05
0.05
0.10
0.10
0.20
0.20
q
q
i
i
0.05
0.05
0.10
0.10
0.05
0.05
0.05
0.05
0.05
0.05
0.10
0.10
Ta duyệt thủ tục OPTIMAL-BST với n, p, q đã cho ta thu
Ta duyệt thủ tục OPTIMAL-BST với n, p, q đã cho ta thu
được ba bảng e[1 6,0 5], w[1 6,0 5] và root[1 5,1 5]
được ba bảng e[1 6,0 5], w[1 6,0 5] và root[1 5,1 5]
như sau:
như sau:
Nhận xét:
Nhận xét:
Với các vòng lặp l, i, j như trên, ta sẽ thu được một
Với các vòng lặp l, i, j như trên, ta sẽ thu được một
nửa trên đường chéo chính các bảng.
nửa trên đường chéo chính các bảng.
Nếu quay bảng đi 45
Nếu quay bảng đi 45
0
0
ngược chiều kim đồng hồ, ta thu
ngược chiều kim đồng hồ, ta thu
được các bảng là:
được các bảng là:
Bảng e thể hiện chi phí của các cây con.
Bảng e thể hiện chi phí của các cây con.
Từ bảng root, ta vẽ được cây tìm kiếm nhị phân tối ưu
Từ bảng root, ta vẽ được cây tìm kiếm nhị phân tối ưu
Để vẽ cây tìm kiếm nhị phân tối ưu chứa các
Để vẽ cây tìm kiếm nhị phân tối ưu chứa các
khóa từ k
khóa từ k
i
i
đến k
đến k
j
j
, dựa vào bảng root ta tìm
, dựa vào bảng root ta tìm
được gốc của cây, theo luật của cây nhị phân
được gốc của cây, theo luật của cây nhị phân
tìm kiếm ta hoàn toàn vẽ được cây.
tìm kiếm ta hoàn toàn vẽ được cây.
Cây thu được từ bảng root, với chi phí tìm
Cây thu được từ bảng root, với chi phí tìm
kiếm là 2.75.
kiếm là 2.75.
k
2
k
1
k
5
k
4
k
3
d
0
d
1
d
2
d
3
d
5
d
4
19
Bài toán xâu trong chung c c đ iự ạ
Bài toán xâu trong chung c c đ iự ạ
K/n Xâu trong: S là xâu trong của T nếu S nhận được
bằng cách xoá đi một số ký tự nào đó. Ví dụ:
‘ABC’ là xâu trong của ‘GAHEBOOC’
Bài toán: Cho 2 xâu T1, T2. Tìm một xâu S là xâu
trong chung của T1 và T2 có độ dài cực đại (gọi là
Xâu con chung dài nhất).
Ví dụ: T1=‘ABCDAE’ và T2=‘XYACADK’ có xâu
‘ACD’ là xâu trong chung với độ dài cực đại.(độ
dài 3).
20
Tư tưởng chung của thuật toán là:
Tư tưởng chung của thuật toán là:
Để tìm ra một xâu con chung dài nhất (LCS) của
Để tìm ra một xâu con chung dài nhất (LCS) của
X=x
X=x
1
1
x
x
2
2
…x
…x
m
m
và
và
Y = y
Y = y
1
1
y
y
2
2
…y
…y
n
n
. Ta xét:
. Ta xét:
- Nếu
- Nếu
x
x
m
m
=y
=y
n
n
, chúng ta phải tìm ra một xâu con chung dài
, chúng ta phải tìm ra một xâu con chung dài
nhất của
nhất của
X
X
m-1
m-1
và
và
Y
Y
n-1
n-1
. Thêm
. Thêm
x
x
m
m
=y
=y
n
n
vào LCS trên ta sẽ thu
vào LCS trên ta sẽ thu
được LCS của X và Y.
được LCS của X và Y.
- Nếu
- Nếu
x
x
m
m
≠ y
≠ y
n
n
thì chúng ta phải giải quyết hai vấn đề:
thì chúng ta phải giải quyết hai vấn đề:
Tìm ra một LCS của
Tìm ra một LCS của
X
X
m-1
m-1
và
và
Y
Y
, tìm ra một LCS của
, tìm ra một LCS của
X
X
và
và
Y
Y
n-1
n-1
.
.
LCS nào dài hơn chính là LCS của X và Y.
LCS nào dài hơn chính là LCS của X và Y.
21
Dựa trên thuật toán đó, ta gọi c[i,j] là độ dài
Dựa trên thuật toán đó, ta gọi c[i,j] là độ dài
xâu con chung dài nhất của X và Y tính từ 1
xâu con chung dài nhất của X và Y tính từ 1
đến x[i] và 1 đến y[j].
đến x[i] và 1 đến y[j].
Tính c[i,j]:
Tính c[i,j]:
Nếu x[i] = y[j] thì c[i,j] = c[i-1,j-1] + 1
Nếu x[i] = y[j] thì c[i,j] = c[i-1,j-1] + 1
Ngược lại: c[i,j] = max{c[i-1,j], c[i,j-1]}.
Ngược lại: c[i,j] = max{c[i-1,j], c[i,j-1]}.
22
Phân tích bài toán: Xây dựng hàm:
Phân tích bài toán: Xây dựng hàm:
Function LCS_Length(x,y:string):word;
Giải pháp đệ quy:
Giải pháp đệ quy:
C[i,j] = 0 Nếu i=0 hoặc j=0
C[i,j] = C[i-1,j-1] + 1 Nếu x[i] = y[j]
C[i,j] = max{C[i-1,j], C[i,j-1]} Nếu x[i] ≠ y[j].
Lập bảng:
Lập bảng:
Sử dụng mảng 2 chiều c (array[1 max,1 max] of word) để tính:
Sử dụng mảng 2 chiều c (array[1 max,1 max] of word) để tính:
c
c[i,j] = LCS_Length(i,j). với i = 1 length(x), j = 1 length(y).
Cụ thể:
For
For
i =1
i =1
to
to
m
m
do
do
For
For
j =1
j =1
to
to
n
n
do
do
If
If
x[i] = y[j]
x[i] = y[j]
then
then
c[i,j] = c[i-1,j-1] + 1
c[i,j] = c[i-1,j-1] + 1
Else if
Else if
c[i-1,j]>=c[i,j-1]
c[i-1,j]>=c[i,j-1]
then
then
c[i,j] = c[i-1,j]
c[i,j] = c[i-1,j]
Else
Else
c[i,j] = c[i,j-1]
c[i,j] = c[i,j-1]
;
;
Ph ng pháp Quy ho ch đ ngươ ạ ộ
23
T ng h p k t quổ ợ ế ả
T ng h p k t quổ ợ ế ả
Max:=c[length(x),lenghth(y)];
S:=‘ ’;
While (max>0) and (i>0) and (j>0) do
If max=c[i-1,j] then i:=i-1
Else if max=c[i,j-1] then j:=j-1
Else Begin
S:=S+x[i];
i:=i-1; j:=j-1;
End;
24
Bài toán in đo n văn b nạ ả
Bài toán in đo n văn b nạ ả
Cho 1 đoạn văn bản gồm n từ có độ dài lần lược là L
1
, L
2
, . . ., L
n
được đo lường bởi các kí tự. Chúng ta muốn in đoạn văn bản
này trên 1 số dòng với độ dài lớn nhất của mỗi dòng là
M=max(L
i
) i=1 n. Nếu trên 1 dòng chứa các từ từ i đến j
(i<j) thì chúng ta đặt chính xác 1 khoảng trống giữa các từ
và khoảng trống hao phí cuối dòng là M-j+i-T(T=tong
L[i j]).
Yêu cầu: xây dựng 1 thuật toán để in đoạn văn bản trên với tổng
hao phí của các dòng là nhỏ nhất
Ví dụ:
N=10
25
Tư tưởng thuật toán:
Tư tưởng thuật toán:
Gọi Ci là tổng hao phí nhỏ nhất để in các từ từ
Gọi Ci là tổng hao phí nhỏ nhất để in các từ từ
1 đến i.
1 đến i.
Rõ ràng ta có:
Rõ ràng ta có:
C
C
1
1
=M-L
=M-L
1
1
Cần tính C
Cần tính C
n
n
= ?
= ?
C
C
i
i
=
=
C
C
i-1
i-1
+ M-L
+ M-L
i
i
nếu in từ i trên 1 dòng mới
nếu in từ i trên 1 dòng mới
C
C
k-1
k-1
+ M – i+k – Tong (L
+ M – i+k – Tong (L
i k
i k
). Nếu in các từ từ k đến ichan trên
). Nếu in các từ từ k đến ichan trên
cùng 1 dòng
cùng 1 dòng
Chọn Min từ 2 trường hợp trên
Chọn Min từ 2 trường hợp trên