giabinh

XauABC

Jul 23rd, 2015
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.06 KB | None | 0 0
  1. const
  2.  fi = 'XauABC.out';
  3.  fo = 'XauABC.out';
  4.  max = 100;
  5. var
  6.  N, MinC,i: longint;
  7.  X, Best: array[1..max] of 'A'..'C';
  8.  T: array[0..max] of longint;
  9.  
  10. function dcgiong(i, l: longint): Boolean;
  11. var
  12.  j, k: longint;
  13. begin
  14.  j := i - l;
  15.  for k := 0 to l - 1 do
  16.  if X[i - k] <> X[j - k] then
  17.  exit(false);
  18.  exit(true);
  19. end;
  20.  
  21. function kt(i: longint): Boolean;
  22. var
  23.  l: longint;
  24. begin
  25.  for l := 1 to i div 2 do
  26.  if dcgiong(i, l) then
  27.  exit(false);
  28.  exit(true);
  29. end;
  30.  
  31. procedure Try(i: longint);
  32. var
  33.  j: 'A'..'C';
  34. begin
  35.  for j := 'A' to 'C' do
  36.  begin
  37.  X[i] := j;
  38.  if kt(i) then
  39.  begin
  40.  if j = 'C' then T[i] := T[i - 1] + 1
  41.  else T[i] := T[i - 1];
  42.  if T[i] + (N - i) div 4 < MinC then
  43.  if i = N then
  44.   begin
  45.    MinC := T[N];
  46.    Best := X;
  47.   end
  48.  else Try(i + 1);
  49.  end;
  50.  end;
  51. end;
  52.  
  53. begin
  54.  Assign(input, fi); Reset(input);
  55.  ReadLn( N);
  56.  Close(input);
  57.  
  58.  Assign(output, fo); Rewrite(output);
  59.  T[0] := 0; MinC := N;
  60.  Try(1);
  61.  for i:=1 to n do write(best[i]);
  62.  Close(output);
  63. end.
  64.  
  65. {
  66. Nếu dãy X1X2…Xn 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
  67. bất kỳ bao giờ cũng phải có 1 ký tự "C". Như vậy với một dãy con gồm k ký tự liên tiếp của dãy X
  68. thì số ký tự C trong dãy con đó bắt buộc phải k div 4.
  69. Tại bước thử chọn Xi, nếu ta đã có Ti ký tự "C" trong đoạn đã chọn từ X1 đến Xi, thì cho dù các
  70. bước đệ quy tiếp sau làm tốt như thế nào chăng nữa, số ký tự "C" sẽ phải chọn thêm bao giờ cũng
  71. (n - i) div 4. Tức là nếu theo phương án chọn Xi như thế này thì số ký tự "C" trong dãy kết quả
  72. (khi chọn đến Xn) cho dù có làm tốt đến đâu cũng Ti + (n - i) div 4. Ta dùng con số này để
  73. đánh giá nhánh cận, nếu nó nhiều hơn số ký tự "C" trong “Cấu hình tối ưu” thì chắc chắn có làm
  74. tiếp cũng chỉ được một cấ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.
  75. }
Advertisement
Add Comment
Please, Sign In to add comment