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: >GiËn qu¸, kh«ng lÏ côc cng 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Õu theo ®Ò bµi chØ giíi h¹n lµ kiÓu string th×: >(*Ch¬ng tr×nh 1: VÐt c¹n, ghi kÕt qu¶ vµo file NGOAC.OUT:*) >procedure Enter; >procedure Init; >procedure Inkq; >procedure Try(i: Byte); >begin >(*Ch¬ng tr×nh 2: TÝnh b»ng c«ng thøc truy håi:*) >procedure Enter; >procedure Add(a, b: TNumber; var c: TNumber); >procedure Sub(a, b: TNumber; var c: TNumber); >procedure WriteNumber(a: TNumber); >procedure Init; >procedure Destroy; >procedure Optimize; >procedure Solve; >begin
>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".
>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 = 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 nhng còng cã thÓ nhÇm l¾m. Nhng 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.
>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;
>begin
> Writeln('n la do dai chan < 254, k la do sau < n/2');
> Write('n, k = '); Readln(n, k);
>end;
>begin
> T[0] := 0;
> C[0] := 0;
> X[0] := Chr(n);
> Assign(f, OutputFile); Rewrite(f);
> Count := 0;
>end;
>begin
> Inc(Count);
> Writeln(f, X);
>end;
>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;
> 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.
>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;
>begin
> Writeln('n: Do dai chan <= 800; k: do sau < n/2');
> Write('n, k = '); Readln(n, k);
>end;
>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;
>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;
>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;
>begin
> New(F); New(Next);
> FillChar(F^, SizeOf(F^), 0);
> F^[0][1] := 1;
>end;
>begin
> Dispose(F); Dispose(Next);
>end;
>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;
>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;
> Enter;
> Start := Time;
> Solve;
> Writeln('Time = ', (Time - Start) / 18.2:1:2, ' (s)');
> Write('Press
>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