Re: Bai toan day ngoac (())()()(). De ra lan truoc

Ng­êi göi: §inh Quang HiÖp (algorithm), 22h46 23/10/2000
Tr¶ lêi bµi: Bai toan day ngoac (())()()(). De ra lan truoc cña Lª Minh Hoµng , 01h16 23/10/2000


ct cña tui chØ giíi h¹n n kho¶ng 80 th«i, nªn ko so ®c víi n~ kq khñng khiÕp (n=800) cña b¸c, tuy nhiªn h×nh nh­ víi n=22, k=8 b¹n ®¸nh nhÇm, kq f¶i lµ 912 (chø ko f¶i lµ 192 nhØ)

bµi nµy theo t«i nghÜ hay nhÊt chØ nªn tÝnh sè nghiÖm lµ võa ®Ñp, cßn muèn khã h¬n 1 chót n÷a th× ®­a thªm 1 chØ sè X vµ x¸c ®Þnh nghiÖm thø X trong tæng sè nghiÖm ®· cho (víi më réng nµy th× n cã lÏ f¶i giíi h¹n < 100), cßn nÕu muèn in ra tÊt c¶ c¸c nghiÖm, cã lÏ vÊn ®Ò nan gi¶i nhÊt nh­ b¸c LMH nãi, kh«ng æ cøng nµo cã thÓ chÞu næi, hichic

@lgoriThm

>B¹n Ph­¬ng vµ b¹n HiÖp ®Òu kh«ng nãi bµi to¸n d·y ngoÆc c¸c b¹n cµi ®Æt trªn m¸y nµo vµ output ra mµn h×nh hay lµ ra file nªn viÖc ®o thêi gian cã lÏ lµ kh«ng cÇn thiÕt. T«i ®· thö cµi ®Æt b»ng thuËt to¸n quay lui cã mét chót ®¸nh gi¸ nh¸nh cËn vµ ch¹y ®­îc kÕt qu¶ nh­ sau:
>n = 8, k = 3 cã 5 nghiÖm (kh«ng ®o ®­îc thêi gian)
>1. ( ( ( ) ( ) ) )
>2. ( ( ( ) ) ( ) )
>3. ( ( ( ) ) ) ( )
>4. ( ( ) ( ( ) ) )
>5. ( ) ( ( ( ) ) )
>n = 22, k = 8 cã 192 nghiÖm (còng kh«ng ®o ®­îc thêi gian)
>n = 30, k = 10 cã 72036 nghiÖm (mÊt h¬n 1 gi©y)
>T«i ®o b»ng nhÞp ng¾t ®Þnh thêi 18.2 lÇn mét gi©y tÝnh c¶ thêi gian ghi kÕt qu¶ vµo file. (Th«ng th­êng ghi file nhanh h¬n nhiÒu ra mµn h×nh)
>n = 50, k = 10 ... - Nãi thÕ nµo nhØ, theo bÝ kÝp cña tæng hîp th× ng­êi ta dïng thuËt ng÷ "Ngñ" (>30 gi©y). "YÕu råi".

>GiËn qu¸, kh«ng lÏ côc c­ng PIII500 cña m×nh l¹i tÖ ®Õn thÕ sao! T«i nghi nghi hoÆc hoÆc lµm theo ý kiÕn cña b¹n Ph­¬ng thö tÝnh sè nghiÖm theo c«ng thøc truy håi xem lµ bao nhiªu mµ ghª thÕ? vµ kÕt qu¶:
>n = 50, k = 10 ; Cã ... 380474702119 nghiÖm. ¤i trêi! thÕ th× gi¶ sö cø mçi nghiÖm nã ghi vµo ®Üa chØ 1 byte th«i th× Hard Disk cña m×nh ®· qua T©y T¹ng råi.

>NÕu theo ®Ò bµi chØ giíi h¹n lµ kiÓu string th×:
>n = 254, k cø cho lµ 10 ®i th× cã: 73935418706570481068683523982536902262900425015329360325147185483071040 nghiÖm.
>Réng h¬n n÷a
>n = 800, k = 100 th× cã:
>128562224951661860257272604835340479918439524709510619179735169654779614608068338224276595573497432893154850206930140501774515349219275327291703844241991797316878506426054480335669960683057925396674459293486125267404096248888140 nghiÖm.
>ChØ riªng viÖc tÝnh to¸n ®· mÊt 5.08 (s)
>§¸nh gi¸ ®é lín cña c¸c con sè nµy thÕ nµo nhØ, ta cø lÊy giíi h¹n tèc ®é tèi ®a mµ c¸c thiÕt bÞ vËt lý kh«ng thÓ v­ît qua: Tèc ®é ¸nh s¸ng 300000km/s. Cho dï ®æi ra millimet, micro mÐt hay nano mÐt th× so víi con sè nµy cø nh­ lµ... (qu¶ thùc t«i kh«ng nghÜ ra ®­îc hai ®èi t­îng nµo lÖch nhau dÕn nh­ vËy)
>Tuy lµ t«i ®· so s¸nh kÕt qu¶ víi ch­¬ng tr×nh quay lui ë trªn nh­ng còng cã thÓ nhÇm l¾m. Nh­ng theo t«i th× bµi to¸n ®­a ra yªu cÇu h¬i ¸c. Sè to nh­ vËy th× kh«ng æn råi. T«i ph¶i gi¨ng ra mét c¸i d·y 30 sè LongInt ®Ó biÓu diÔn nã ®Êy.
>T«i m¹n phÐp c¸c siªu sao lËp tr×nh mµ ®­a ra ch­¬ng tr×nh viÕt b»ng Borland Pascal 7 ®Ó chøng minh kh«ng ph¶i t«i nãi mß. C¸c b¹n ®õng ch¹y vµo lóc giao thêi 12 giê ®ªm nhÐ, kÎo nã ra thêi gian ©m ®Êy.

>(*Ch­¬ng tr×nh 1: VÐt c¹n, ghi kÕt qu¶ vµo file NGOAC.OUT:*)
>program Ngoac;
>const
> OutputFile = 'NGOAC.OUT';
> max = 254;
>var
> X: string;
> T, C: array[0..max] of Integer;
> n, k: Integer;
> f: Text;
> Count: LongInt;
> Start: LongInt;
> Time: LongInt absolute 0:$46C;

>procedure Enter;
>begin
> Writeln('n la do dai chan < 254, k la do sau < n/2');
> Write('n, k = '); Readln(n, k);
>end;

>procedure Init;
>begin
> T[0] := 0;
> C[0] := 0;
> X[0] := Chr(n);
> Assign(f, OutputFile); Rewrite(f);
> Count := 0;
>end;

>procedure Inkq;
>begin
> Inc(Count);
> Writeln(f, X);
>end;

>procedure Try(i: Byte);
>begin
> if (T[i - 1] < k) and (T[i - 1] + 1 <= n - i) then {Mo ngoac}
> begin
> X[i] := '(';
> T[i] := T[i - 1] + 1;
> if C[i - 1] < T[i] then C[i] := T[i]
> else C[i] := C[i - 1];
> Try(i + 1);
> end;
> if (T[i - 1] > 0) and
> ((C[i - 1] = k) or (k + k - T[i - 1] + 1 + i <= n))
> then {Dong ngoac}
> begin
> X[i] := ')';
> T[i] := T[i - 1] - 1;
> C[i] := C[i - 1];
> if (i = n) then Inkq
> else Try(i + 1);
> end;
>end;

>begin
> Enter;
> Start := Time;
> Write('Ghi ket qua vao file ', OutputFile, '...');
> Init;
> Try(1);
> Close(f);
> Writeln('Co ', Count, ' nghiem');
> Writeln('Time = ', (Time - Start) / 18.2:1:2, ' (s)');
> Write('Press ');
> Readln;
>end.

>(*Ch­¬ng tr×nh 2: TÝnh b»ng c«ng thøc truy håi:*)
>program Ngoac;
>const
> maxn = 800;
> maxk = 400;
> maxDigit = 30;
> Billion = 1000000000;
> GroupDigit = 9;
>type
> TNumber = array[1..maxDigit] of LongInt;
> TLine = array[0..maxk] of TNumber;
> PLine = ^TLine;
>var
> n, k: Integer;
> F, Next: PLine;
> Below_Equal, Below: TNumber;
> Start: LongInt;
> Time: LongInt absolute 0:$46C;

>procedure Enter;
>begin
> Writeln('n: Do dai chan <= 800; k: do sau < n/2');
> Write('n, k = '); Readln(n, k);
>end;

>procedure Add(a, b: TNumber; var c: TNumber);
>var
> i: Integer;
> t, m: LongInt;
>begin
> FillChar(c, SizeOf(c), 0);
> m := 0;
> for i := 1 to maxDigit do
> begin
> t := a[i] + b[i] + m;
> c[i] := t mod Billion;
> m := t div Billion;
> end;
>end;

>procedure Sub(a, b: TNumber; var c: TNumber);
>var
> i: Integer;
> t, m: LongInt;
>begin
> FillChar(c, SizeOf(c), 0);
> m := 0;
> for i := 1 to maxDigit do
> begin
> t := a[i] - b[i] - m;
> if t < 0 then
> begin
> t := t + Billion;
> m := 1;
> end
> else
> m := 0;
> c[i] := t mod Billion;
> end;
>end;

>procedure WriteNumber(a: TNumber);
>var
> i, j: Integer;
> S: string;
>begin
> i := maxDigit;
> while (i > 1) and (a[i] = 0) do Dec(i);
> Write(a[i]);
> for j := i - 1 downto 1 do
> begin
> Str(a[j], s);
> while Length(s) < GroupDigit do s := '0' + s;
> Write(s);
> end;
>end;

>procedure Init;
>begin
> New(F); New(Next);
> FillChar(F^, SizeOf(F^), 0);
> F^[0][1] := 1;
>end;

>procedure Destroy;
>begin
> Dispose(F); Dispose(Next);
>end;

>procedure Optimize;
>var
> i, j: Integer;
> temp: PLine;
>begin
> for i := 1 to n do
> begin
> for j := 0 to k do
> begin
> if (j > 0) then Next^[j] := F^[j - 1]
> else FillChar(Next^[j], SizeOf(Next^[j]), 0);
> if (j < k) then Add(F^[j + 1], Next^[j], Next^[j]);
> end;
> temp := F; F := Next; Next := temp;
> end;
>end;

>procedure Solve;
>var
> Result: TNumber;
>begin
> Init;
> Optimize;
> Below_equal := F^[0];
> Destroy;
> Dec(k);
> Init;
> Optimize;
> Below := F^[0];
> Destroy;
> Sub(Below_Equal, Below, Result);
> Write('Co '); WriteNumber(Result); Writeln(' nghiem');
>end;

>begin
> Enter;
> Start := Time;
> Solve;
> Writeln('Time = ', (Time - Start) / 18.2:1:2, ' (s)');
> Write('Press ...'); Readln;
>end.
>C¸c b¹n th«ng c¶m v× khi Post ch­¬ng tr×nh lªn th× ch¾c lµ c¸c tr×nh bµy cÊu tróc tiªu hÕt c¶ thµnh c¨n lÒ tr¸i. RÊt mong nhËn ®­îc c¸c gãp ý vÒ ®¸p sè (D¹o nµy t«i vÉn cã bµi ®Òu ®Òu mµ ch¼ng thÊy ai Reply c¶!). Nh÷ng thø "chª bai" ®Ò bµi ë trªn lµ nãi cho vui th«i, qu¶ thùc qua nh÷ng bµi nh­ thÕ nµy t«i häc hái ®­îc rÊt nhiÒu. C¶m ¬n ng­êi ra ®Ò Ta Cong Thuyen


§äc c¸c bµi tr¶ lêi