Đề 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. |
Recent Comments