Đề bài:
Thuật toán:
- Gọi F[i][j] là độ dài dãy con dài nhất của dãy A[1..i] có tổng các phần tử chia k dư j.
Các bạn có thể tham khảo thuật toán chi tiết ở trang 162 quyển “Giải thuật và lập trình” của thầy Lê Minh Hoàng.
Code:
uses math;
const
fi='';
fo='';
maxn=1000;
maxk=50;
var
f : array[0..maxn,0..maxk] of longint;
a : array[1..maxn] of longint;
i,j,n,k : longint;
procedure enter;
begin
assign(input,fI);reset(input);
readln(n,k);
for i:=1 to n do read(a[i]);
close(input);
end;
function calc ( x,y : longint) : longint;
var tg : longint;
begin
tg := (x-y) mod k ;
if tg<0 then tg := tg+k;
exit(tg);
end;
procedure solve;
begin
for i:=0 to n do
for j:=0 to k-1 do
f[i,j] := -maxn*maxn;
f[0,0] := 0;
for i:=1 to n do
for j:=0 to k-1 do
f[i,j] := max(f[i-1,j],f[i-1,calc(j,a[i])] +1);
end;
procedure print;
begin
assign(output,fo);rewrite(output);
writeln(f[n,0]);
close(output);
end;
begin
enter;
solve;
print;
end.
Speak Your Mind