Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const
- fi = 'XauABC.out';
- fo = 'XauABC.out';
- max = 100;
- var
- N, MinC,i: longint;
- X, Best: array[1..max] of 'A'..'C';
- T: array[0..max] of longint;
- function dcgiong(i, l: longint): Boolean;
- var
- j, k: longint;
- begin
- j := i - l;
- for k := 0 to l - 1 do
- if X[i - k] <> X[j - k] then
- exit(false);
- exit(true);
- end;
- function kt(i: longint): Boolean;
- var
- l: longint;
- begin
- for l := 1 to i div 2 do
- if dcgiong(i, l) then
- exit(false);
- exit(true);
- end;
- procedure Try(i: longint);
- var
- j: 'A'..'C';
- begin
- for j := 'A' to 'C' do
- begin
- X[i] := j;
- if kt(i) then
- begin
- if j = 'C' then T[i] := T[i - 1] + 1
- else T[i] := T[i - 1];
- if T[i] + (N - i) div 4 < MinC then
- if i = N then
- begin
- MinC := T[N];
- Best := X;
- end
- else Try(i + 1);
- end;
- end;
- end;
- begin
- Assign(input, fi); Reset(input);
- ReadLn( N);
- Close(input);
- Assign(output, fo); Rewrite(output);
- T[0] := 0; MinC := N;
- Try(1);
- for i:=1 to n do write(best[i]);
- Close(output);
- end.
- {
- 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
- 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
- thì số ký tự C trong dãy con đó bắt buộc phải k div 4.
- 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
- 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
- (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ả
- (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 để
- đá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
- 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.
- }
Advertisement
Add Comment
Please, Sign In to add comment