You are on page 1of 52

Mt s vn c s ca Tin hc

Bui 3:

Cu trc d liu v thut gii


Gio vin: T Thc Nhu Khoa CNTT trng H Lc Hng

QUI RECURVE
2 M ha

Khi nim Qui


Mt i tng c gi l qui nu n hoc 1 phn ca n c nh nghi thng qua khi nim v chnh n. V d: nh nghi php ton giai tha, k hiu: N! (a) Nu N = 0, th N! = 1 (b) nu N > 0 th N! = N*(N-1)!

V d: nh nghi UCLN ca 2 s x v y, k hiu: UCLN(x, y) (a)UCLN(x,y) = x nu y = 0 (b)UCLN(x,y) = UCLN(y, phn d ca x/y) nu y<>0

M ha

Chng trnh qui


Mt chng trnh l qui nu trong chng trnh c li gi n chnh n.

V d: nh ngha hm tnh N! theo qui. int GiaiThua(int N) { if (N == 0) return 1; return N * GiaiThua(N - 1); }

M ha

Mt nh nghi qui phi c 2 thnh phn:


Thnh phn dng: Khng cha khi nim ang nh nghi
V d: N! = 1

Thnh phn qui: c cha khi nim ang nh nghi

M ha

V d: Tnh UCLN(x,y) theo thut ton Euclide (a)UCLN(x,y) = x nu y = 0 (b)UCLN(x,y) = UCLN(y, phn d ca x/y) nu y<>0 int UCLN(int x, int y) { if (y == 0) return x; return UCLN(y, x % y); }

M ha

THUT GII QUAY LUI BACK TRACKING

M ha

Tng quan thut gii Quay lui (Back Tracking)


Dng gii bi ton lit k cc cu hnh Mi cu hnh c xc nh bng cch xy dng tun t tng thnh phn trong cu hnh. Mi thnh phn c xc nh bng cch chn la d liu trong tp kh nng c xut.

Cu hnh mt li gii

X1

X2

X3

Xn

Tp kh nng

K1

K2

Km

M ha

M hnh thut gii quay lui: Xc nh phn t Xi bng quy


void Try( int i ) { If (Xi l phn t cui cng trong cu hnh) < Thng bo cu hnh tm c>; else for ( mi Kj thuc tp kh nng c cho Xi) [ if ( Chp nhn Kj ) ] { Th chn Kj cho Xi; Try( i+1); //Gi quy xc nh phn t Xi+1 B ghi nhn Kj chn cho Xi chn kh nng khc; } }
9 M ha

Hai im mu cht quyt nh phc tp ca bi ton l: 1. Xc nh tp kh nng c: Ph thuc vo vic phn tch nhu cu d liu ca tng thnh phn trong cu hnh 2. Kim tra kh nng c phi ph hp vi thnh phn cn xc nh.

10

M ha

Bi ton: Lit k cc dy nh phn c di n


Phn tch: Biu din cu hnh dy nh phn di dng: X[1..n] Tp kh nng c cho mi phn t Xi l {0, 1} Thut gii xc nh phn t Xi ca dy nh phn nh sau: void Try(int i) { if ( i > n ) <Thng bo cu hnh tm c>; else for (int j =0; j<= 1; j++) { X[ i ] = j; Try( i + 1 ); } }
11 M ha

M i tun: ch ra hnh trnh ca qun M xut pht t mt trn bn c i qua tt c cc cn li ca bn c, mi ng 1 ln.


Phn tch: Cu hnh li gii l BC[1..n][1..n] cha s th t hnh trnh ca qun M. Tp kh nng cha cc gi tr dng tnh ta cc k tip dx[1..8] = {-2,-1, 1, 2, 2, 1, -1, -2} dy[1..8] = { 1, 2, 2, 1, -1, -2, -2, -1} iu kin chn kh nng cho bc i th i l c chn phi : Thuc bn c V cha i qua
12 M ha

(u, v)

(x, y)

Thut gii xc nh bc i th i ca qun M


void Try(int i) { int j,u,v; if (i > n*n) <Thng bo cu hnh tm c>; else for ( j =1; j <= 8 ; j++) { u =x+dx[j]; v = y+dy[j]; if (u >= 1 && u <= n && v >= 1 && v<=n && BC[u,v] = 0) { x = u; y = v; BC[u,v] = i; Try(i+1); x = u-dx[j]; y = v-dy[j]; BC[u,v] = 0; } } }
13 M ha

Bi ton: Lit k cc hon v ca dy s {1, 2, .., n}


Biu din cu hnh mt hon v: X[1..n] Tp kh nng c: { 1, 2, .., n } Nhng do Xi <> Xj vi i <> j. Nn phi kim tra gi tr c cho Xi phi khc vi cc gi tr chn cho cc thnh phn trc . Hng gii quyt chung l t chc cc bin trng thi lu tr thng tin phc v cho vic kim tra: Dng mng F[1..n] ghi nh tnh trng s dng ca tng kh nng trong tp S={1, 2, .., n}, vi qui c:
F[ j ] = 0 nu j cha s dng F[ j ] = 1 nu j s dng
14 M ha

Thut gii xc nh phn t Xi ca mt hon v


void Try(int i) { if ( i > n ) <Thng bo cu hnh tm c>; else for (int j = 1; j<= n; j++) if (F[j] = 0) { X[i] = j; F[j] = 1; Try( i + 1 ); F[j] = 0; } }
15 M ha

V d: Lit k cc tp con k phn t ca tp S = {1, 2, .., n}. Trong (k <= n)


Biu din cu hnh mt tp con K phn t: X[1..K] Tp kh nng c: { 1, 2, .., n } Nhng do Xi <> Xj vi i <> j. Nn cc gi tr c cho Xi phi khc vi cc gi tr c cho cc thnh phn trc Hng gii quyt: Dng mng F[1..N] ghi nh tnh trng s dng ca tng kh nng trong tp S={1, 2, .., N}, vi qui c:
F[ j ] = 0 nu j cha s dng F[ j ] = 1 nu j s dng

16

M ha

Thut gii xc nh phn t Xi ca mt tp con


void Try(int i) { if ( i > K ) <Thng bo cu hnh tm c>; else for (int j = 1; j<= N; j++) if (F[j] = 0) { X[i] = j; F[j] = 1; Try( i + 1 ); F[j] = 0; } }
17 M ha

Mt cch gii khc ca bi ton tp con


a ra iu kin cho mi tp con l : 1 <= X[1] < X[2] < .. < X[ i ] < .. < X[K-1] < X[K] <= N Nhn xt:
X[K] <= N X[K-1] <= X[K] - 1 <= N - 1 X[ i ] = X[K-(K-i)] <= N - (K - i)

Do , ta c th gii hn gi tr c cho thnh phn X[i] trong khong t : X[i-1]+1 n (N K + i) iu ny cng ng cho c trng hp i = 1, ta thm vo X[0] = 0.
18 M ha

Thut gii xc nh phn t Xi ca mt tp con


void Try(int i)
{ if ( i > K ) <Thng bo cu hnh tm c>; else for (int j = X[i-1]+1; j<= N-K+i; j++) { X[i] = j; Try( i + 1 ); } }
19 M ha

K THUT NHNH CN

20

M ha

Cng dng
Dng gii quyt bi ton tm cu hnh tt nht trong cc cu hnh lit k bng thut ton quay lui. Gim thi gian thc hin ca thut ton quay lui.
K thut nhnh cn thm vo cho thut ton quay lui kh nng nh gi cu hnh tng bc. Nu ti bc th i nh gi c cu hnh khng ti u th quay lui ngay khng cn phi gi quy tm tip cc thnh phn khc ca cu hnh.

21

M ha

M hnh nh gi nhnh cn trong thut ton quay lui:


// Khi to cu hnh BESTCONFIG xu nht void Init() { <Khi to mt cu hnh BESTCONFIG xu nht> } //M hnh thut ton quay lui xc nh X[i] c nh gi nhnh cn void Try( int i ) { If (Xi l phn t cui cng trong cu hnh) <Cp nht BESTCONFIG>; else for ( mi Kj thuc tp kh nng c cho Xi) [ if ( Chp nhn Kj ) ] { Th chn Kj cho Xi; if (cn hy vng tm ra cu hnh tt hn BESTCONFIG) Try( i+1); B ghi nhn Kj chn cho Xi chn kh nng khc; } }
22 M ha

Bi ton ngi du lch


C n thnh ph (c nh s t 1 n n). Mt ngi i du lch xut pht t mt thnh ph mun i thm cc thnh ph khc, mi thnh ph ng mt ln ri quay v ni xut pht. Gi thit bit c chi ph i t thnh ph i n thnh ph j l C[i,j], 1 i, j < n. Hy tm 1 hnh trnh cho ngi du lch tng chi ph theo hnh trnh ny l t nht.

2 1 3 1 1 2 4 2 4 3

0 3 2 1

3 0 1 2

2 1 0 4

1 2 4 0

Ma trn chi ph C
23 M ha

Phn tch:
Cu hnh li gii : X[1..n]
X[1] = 1 c xem l thnh ph xut pht. Mt hnh trnh l mt hon v ca cc thnh ph 2, .. ,n.

Tp kh nng c : {2, 3,.., n} Cu hnh BESTCONFIG:


Smin l tng chi ph thp nht chn trong cc hnh trnh tm c. Khi to ban u cho Smin = Cmax * (n + 1), trong Cmax l chi ph ln nht trong cc chi ph C[i, j] cho BestWay[1..n] : cha hnh trnh c chi ph thp nht.

24

M ha

Cc vn cn thc hin khi xc nh thnh phn X[i]:


1. Kim tra kh nng c cho thnh phn X[i] hp l: kh nng cha c chn cho cc thnh phn trc X[i]. 2. Ghi nhn tng chi ph cho hnh trnh t X[1] n X[i]. 3. D on cu hnh li gii tt hn hay xu hn BESTCONFIG

25

M ha

2- Ghi nhn tng chi ph cho hnh trnh t X[1] n X[i]


Mng T[1..n] ghi nhn tng chi ph ti mi bc T[i] cha tng chi ph cho hnh trnh t X[1] n X[i] Nu thnh ph j c c cho thnh phn X[i] th: T[i] = T[i-1] + C[X[i-1], j] Tng chi ph ca hnh trnh t X[1] n X[n] v tr v X[1] l: T[n] + C[X[n], 1]
2 1 3 1 1 2 4
26

2 4
M ha

3- D on cu hnh li gii tt hn hay xu hn BESTCONFIG


Gi Cmin l chi ph thp nht trong cc chi ph C[i, j] cho. Sau khi xc nh X[i], nu i tip (n i +1) thnh ph na th chi ph ti thiu phi l T[i] + Cmin*(n-i+1). Nu T[i] + C[i,j]*(n-i+1) < Smin th c kh nng tm c hnh trnh tt hn BESTCONFIG, ngc li th hnh trnh tm c s khng tt hn BESTCONFIG.

27

M ha

Thut gii xc nh thnh phn X[i]


void Try(int i) { if ( i > n ) if ( T[n] + C[x[n] , 1] < Smin ) { Smin = T[n] + C[x[n] , 1]; Ghi nhn X l hnh trnh tt nht: Bestway = X; } else for (int j = 2; j <= n; j++) if (F[ j ] = 0) { X[ i ] = j; F[ j ] = 1; T[ i ] = T[i -1] + C[ x[i -1], j]; if ( T[ i ] + (n-i+1)*Cmin < Smin) Try( i + 1 ); F[ j ] = 0; } }
28 M ha

Bi ton chui 123


Tm mt chui c di n (n <= 100) ch gm cc s 1, 2, 3 tha mn iu kin: 1. Hai chui con bt k lin nhau u khc nhau 2. C t s 3 nht V d: n = 9. Chui no sau y hp l? 131213212 123212313 123212321
29 M ha

Phn tch
Cu hnh li gii: X[1..n] Tp kh nng c: { 1, 2, 3 } Cu hnh BESTCONFIG:
1. Min3: cha s lng s 3 t nht. Khi to Min3 = n 2. BestStr[1..n]: cha chui c s lng s 3 t nht.

30

M ha

Cc vn cn thc hin khi xc nh thnh phn X[i]:


1. Kim tra kh nng c cho thnh phn X[ i ] hp l: ngha l chui X[1..i] khng c 2 chui con lin k ging nhau. 2. Ghi nhn s lng s 3 c trong chui X[1..i] 3. D on cu hnh li gii tt hn hay xu hn BESTCONFIG

31

M ha

1- Kim tra chui X[1..i] khng c 2 chui con lin k ging nhau.
V d: 123212321 123212321 123212321 123212321 123212321 } int ChuoiHopLe(int i) { for (L = 1; L <= i / 2; L++) if ( X[(iL+1) .. i] = X[(i2L+1) .. (i- L)] ) return 0; return 1;

32

M ha

2- Ghi nhn s lng s 3 trong chui X[1..i]


Mng T[1..n] ghi nhn s lng s 3 ti mi bc T[i] cha s lng s 3 trong chui X[1..i ] Nu gi tr c l 3 th T[i] = T[i-1] +1, ngc li th T[i] = T[i-1]

33

M ha

3- D on cu hnh li gii tt hn hay xu hn BESTCONFIG


131213212 131213212 131213212 131213212 131213212 131213212 Do 2 chui con k phi khc nhau nn: Trong 4 s lin tip phi c mt s 3. Do , mt dy con c di l k phi c t nht (k / 4) s 3. Sau khi xc nh thnh phn X[i] v ghi nhn s lng s 3 trong T[i], ta cn (n i) thnh phn cn xc nh. Do , cu hnh tm c phi c t nht (T[i] + (n-i)/4) s lng s 3. Nu (T[i] + (n-i)/4) < Min3 th c kh nng tm c cu hnh tt hn BESTCONFIG, ngc li th cu hnh tm c s khng tt hn BESTCONFIG.

34

M ha

Thut gii xc nh thnh phn X[i]


void Try(int i) { if ( i > n ) { Min3 = T[n]; Ghi nhn X l chui tt nht: BestStr = X; } else for (int j = 1; j <= 3; j++) { X[i] = j; if (ChuoiHopLe( i )) { if (j == 3) T[i] = T[i -1] + 1; else T[i] = T[i -1]; if ( T[ i ] + (n - i)/4 < Min3) Try( i + 1 ); } } }
35 M ha

Gii thut chia tr (Devide and conquer)

36

M ha

Tng quan gii thut chia tr


K thut chia tr bao gm hai qu trnh: Phn chia bi ton cho thnh cc bi ton con cng loi, ln lt gii tng bi ton con mt cch c lp. Tng hp kt qu t bi ton con c li gii ca bi ton ban u. Thng thng, chia b d liu u vo thnh cc phn ring r, sau gi 2 th tc qui vi b d liu u vo l cc phn va chia.

37

M ha

Mt s bi ton tiu biu


Tm nh phn QuickSort Nhn s nguyn ln

38

M ha

Tm nh phn trn mng sp th t


Bi ton : Cho mng A[1..n] c sp xp theo th t khng gim v x. Tm i sao cho A[i] = x. Phn tch: Do mng A sp th t tng nn x: Hoc l bng phn t nm v tr gia mng A Hoc l nm na bn tri (x<phn t gia mng A ) Hoc l nm na bn phi (x>phn t gia mng A )

39

M ha

Thut gii: Tm nh phn trn mng sp th t


int Bsearch(x, A[ ], int L, int R) { if (L > R) then return -1; else { M = (L + R)/2; If (x = A[M]) return M; If (x < A[M]) return Bsearch(x, A, L, M-1) return Bsearch (x, A, M+1, R) } }
40 M ha

Bi ton tng t: Tm ng i cho xe c ti trng ln nht


C N thnh ph, cho bit mi con ng ni t thnh ph i n thnh ph j (vi i <> j) c th cho xe vi trng ti khng qu C[i, j] i qua. Cho thnh ph xut pht x v thnh ph ch y. Hy tm mt ng i t thnh ph x ti thnh ph y m trng ti ln nht c th c. tng: Khi to: Cmax = MAX{Cij} vi mi i khc j; Cmin =Min{Cij} Xt on [ Cmin , Cmax] 1. t Cm = (Cmax+Cmin) div 2. 2. Ta kim tra xem c tn ti ng i t x ti y cho xe c trng ti Cm hay khng?
a) Nu tn ti ng i, ta ghi nhn kt qu v xt tip on [Cm+1,Cmax]. b) Nu khng tn ti ng i, ta chuyn sang xt on [Cmin ,Cm -1].

3. Lp li cho ti khi on c gi tr u ln hn gi tr cui.

41

M ha

Thut gii chn l trnh c ti trong ln nht


void Chon(int Cmin, int Cmax) { if (Cmin <= Cmax) { Cm = (Cmin + Cmax)/2; d = 0; // di l trnh LoTrinh[0] = x; // Mng ghi nhn l trnh i t x n y if (TonTai(LoTrinh, d, x, Cm ) ) { GhiNhan(LoTrinh, d, Cm); Chon(Cm+1, Cmax); } else Chon(Cmin, Cm-1) ; } }
42 M ha

Thut gii kim tra tn ti l trnh cho xe c ti trng Cm i qua


int TonTai(LoTrinh[ ], int &d, int i, int Cm) { int j; if ( i = y ) return 1; for (j = 0; j < n; j++) if (F[ j ] = 0 && C[ i ][ j ] >= Cm) { F[ j ] = 1; d++; LoTrinh[d] = j; if (TonTai(LoTrinh, d, j, Cm)) return 1; d--; F[ j ] = 0; } return 0; }
43 M ha

Bi ton tng t
Cho N v S l 2 s nguyn dng. Trong , N<= 100 v S <= 10100 Bit rng cn bc N ca mt s S l mt s nguyn < 106. Hy tm cn bc N ca S V d: S = 30517578125 N = 15 KQ = 5

44

M ha

Thut ton sp xp mng Quick Sort


tng thut ton sp xp tng cho dy X[L .. R] Bc 1: Phn chia dy X[L .. R] thnh 2 dy con bng cch:
Chn gi tr P ca 1 phn t trn dy X[L .. R] lm mc phn hoch. i ch cc phn t X[i]>= P vi cc phn t X[j]<= P, vi i < j Khi i > j, dy ban u c phn thnh 2 phn:

1. X[ L .. j ] cha gi tr <= P 3. X[ j .. i ] cha gi tr = P 2. X[ i .. R ] cha gi tr >= P Bc 2:


Nu X[L .. j] c hn 1 phn t th sp xp tng dy X[L .. j] Nu X[i .. R] c hn 1 phn t th sp xp tng dy X[i .. R]
45 M ha

Minh ha thut ton


5
i

1 1 1 1

7 7
i

5 5 5
i=j

3 3
j

6 6 6 6

2
j

9 9 9 9
R

2 2 2
L

5 5 5

3 3
j

7 7
i

2 1
L=j

1 2

3 3
i=R

7 5
L=j

6 6

5 7
i

9 9
R

7 7
j L

9 9
i=R

5
46

9
M ha

Thut gii Quick Sort


void QuickSort(X[L .. R]) { int i = L; int j = R; P = X[i]; while (i <= j) { while (X[i] < P) i++; while (X[j] > P) j--; if (i <= j) { if (X[i] <> X[j]) Hoanvi(X[i], X[j]); i++; j--; } } if (L < j) QuickSort(X[L ..j ]); if (i < R) QuickSort(X[i .. R]); }
47 M ha

Nhn hai s nguyn X.Y c n ch s


Phn tch: Chia X thnh 2 s nguyn c n/2 ch s: X=A.10n/2+B Chia Y thnh 2 s nguyn c n/2 ch s: Y=C.10n/2+D X.Y = A.C.10n+(A.D+B.C)10n/2+B.D Mt khc: R = (A + B)(C + D) = A.C + A.D + B.C + B.D A.D+B.C = R A.C B.D Khi : X.Y = A.C.10n+(R-A.C-B.D)10n/2+B.D Php nhn vi 10n thc cht l thm n ch s 0 3 php nhn s nguyn ln n/2 ch s :A.C, B.D, (A+B)(C+D) tip tc c phn chia cho n khi 2 ton hng ch c mt ch s.
48 M ha

V d: nhn X=981 vi Y=1234.


Trc tin chng ta in thm vo ton hng ngn hn cc s 0 v ngha lm cho hai ton hng c cng di: 981 tr thnh 0981. Sau tch tng ton hng thnh hai na: X = 0981 cho ra A = 09 v B = 81 981 = A.102 + B Y = 1234 thnh C = 12 v D = 34 1234 = C.102 + D Do , tch cn tm c th tnh c l:
P = A.C = 09 * 12 = 108 Q = B.D = 81 * 34 = 2754 R = (A + B)(C + D) = 90 * 46 = 4140

v cui cng
981 x 1234 = P.104 + (R P Q).102 + Q = 1080000 + 127800 + 2754 = 1210554.

49

M ha

Thut gii: Nhn 2 s nguyn c n ch s


SoLon Nhan(SoLon X, SoLon Y, int n) {
If ( n = 1) return X*Y; A=left(X,n/2); B=right(X,n/2); C=left(Y,n/2); D=right(Y,n/2); P = Nhan(A,C,n/2); Q = Nhan(B,D,n/2); R = Nhan(A+B,D+C,n/2); return (P*10n +(R-P-Q)*10n/2 + Q);

}
50 M ha

Mt s bi ton bui 3
1. 2. 3. 4. 5. Mi ht x ngu c 6 mt, mi mt cha t 1 n 6 du chm. Lit k cc kt qu phn bit c th c khi cng lc 3 ht x ngu, khng k th t xut hin trn cc ht x ngu, v d {1, 2, 3} v {2, 3, 1} l nh nhau. Cho 1 mng gm n cc s nguyn a[1], a[2],.., a[n] v mt s nguyn S. Hy tm tt c cc dy con : 1 <= x1 < x2 < .. < xk <= n sao cho: a[x1] + a[x2] + ..+ a[xk] = S Tnh s cch v in tt c cc cch phn tch s t nhin N >1 thnh tng cc s t nhin nh hn n (mi phn tch ch k ng mt ln: 4+3+1 v 1+4+3 ch l mt) Hy tm tp hp cc du '+, - v khng du gia dy s 123456789 sao cho c mt biu thc c gi tr bng = N cho trc. V d: N = 280 ta c cc t hp sau: 1+2+345-67+8-9; 1+234-5+67-8-9; 123-4+5+67+89 Cho mt dy N s nguyn. Hy loi b khi dy mt s phn t c mt dy con, c t nht 2 phn t, khng gim v di nht. In ra dy con . V d: N = 10 2 6 -7 5 8 1 -3 5 15 9 Kt qu tm c dy con khng gim di nht c 4 phn t: -7 -3 5 9
51 M ha

6.

Trn bn c vung 4x4 xp 8 qun c gm 4 qun mu en v 4 qun mu trng sao cho trn mi hng v mi ct c ng mt qun mu en v 1 qun mu trng. Th hin trn mn hnh cc cch sp xp ny Mt ngi cha mang theo s tin l M vo mt ca hng mua K mn qu tng cho cc con. Trong ca hng c N mt hng, mt hng th i c gi tin l Ai. Ngi cha cn chn K (K < N) mt hng khc nhau lm qu sao cho tng s tin ca K mt hng ny khng ln hn s tin mang theo v chnh lch gi tin ca K mt hng l thp nht. Mt dy chuyn sn xut c N (N<=100) v tr. C N cng nhn, cho bit nng sut ca cng nhn th i m lm v tr th j l Cij (Cij : Integer). Hy sp xp N cng nhn vo N v tr sao cho t nng sut cao nht. Cho ma trn vung cp 8 cha cc s nguyn. Tm gi tr ln nht ca tng 8 s hng trn ma trn s trn sao cho 2 s hng bt k trong 8 s hng trn khng nm trn cng mt hng, khng cng nm trn mt ct v khng cng nm trn ng cho .

7.

8.

9.

10. Cho mt bng A c M hng, N ct (3 M, N 50), Mi phn t ca bng l mt s nguyn nhn gi tr t 0 n 99. Cho mt s K (2 K Min(M, N)). Tm K phn t trong bng A tng ca K phn t ny l ln nht, vi iu kin l trn mi hng chn nhiu nht mt phn t, mi ct chn nhiu nht mt phn t. 11. Mt c s sn xut cn phn cng M nhn vin tham gia thc hin N hp ng sn xut sn phm (M >= N). Mi nhn vin ch tham gia thc hin mt hp ng. Ngi ta d tnh rng, nu phn cng i nhn vin tham gia thc hin hp ng j th c thi gian hon thnh hp ng l T[i,j]. Hy tm phng n phn cng mi hp ng bao nhiu nhn vin sao cho tng s thi gian hon thnh N hp ng l t nht.
52 M ha

You might also like