Dạng 4: Phân chia dãy số tạo ra các dãy con

Một phần của tài liệu CÁC DẠNG BÀI VỀ DẠY CON VÀ HƯỚNG GIẢI QUYẾT (Trang 47 - 48)

- Xây dựng chương trình con kiểm tra một dãy đảm bảo tính chất là dãy Fibonacci, nghĩa là nếu một dãy d có y phần tử thì dãy đó có đặc điểm :

Dạng 4: Phân chia dãy số tạo ra các dãy con

Bài 22. Dãy 2-SUM

Một dãy các số nguyên không âm A[1..N] được gọi là 2-Sum nếu ta có thể tách dãy đó làm 2 dãy có tổng các giá trị bằng nhau. Nghĩa là tồn tại một số k trong đoạn [1..N-1] sao cho tổng A[1] + A[2] + … + A[k] = A[k+1] + A[k+2] + … + A[N]. Cho 1 dãy gồm N số nguyên không âm. Hãy tìm dãy con gồm các phần tử liên tiếp dài nhất mà cũng là dãy 2-Sum.

Dữ liệu: Vào từ file 2Sum.Inp

- Dòng đầu tiên chứa số nguyên N (2 <= N <= 5000). - N dòng tiếp theo, dòng thứ i chứa giá trị

của phần tử A[i] của dãy. (0≤A[i]

≤200000)

Kết quả: Ghi ra file 2Sum.Out

Trần Thị Thanh Huyền - GV Trường THPT chuyên Lê Hồng Phong NĐ

2SUM.INP 2SUM.OUT 6 2 10 3 2 5 4 47

Gồm một dòng là độ dài lớn nhất của dãy 2-Sum tìm được. Nếu không có kết quả thì in ra 0.

Giải thích: dãy 2-Sum dài nhất tìm được là A[2..5] = {10, 3, 2, 5}. Có thể tách dãy này thành 2 phần {10} và {3, 2, 5} có tổng bằng 10.

Thuật toán

Sử dụng thuật toán Quy hoạch động như sau:

- Gọi F[i] là tổng các phần tử từ vị trí 1 đến vị trí i . - Xét đoạn l->r , tìm vị trí k thỏa l ≤ k ≤ r

Khi đó tổng các phần tử từ l k = tổng các phần tử từ k+1 r.

Ta có công thức : f[k] – f[l-1] = f[r] – f[k]  2f[k] = f[r] + f[l-1]. - chặt nhị phân trên F như sau:

Cho biến len (là nghiệm cần tìm) chạy từ n 2 tìm chiều dài lớn nhất khi ta tìm được l,r,k thì dừng việc tìm ngay .

hình thành l : 1 -> n-len+1 và r = l+len-1)

Chương trình

const finp='2SUM.INP'; fout='2SUM.OUT';

var n,i,j,l,len,k : longint;

Một phần của tài liệu CÁC DẠNG BÀI VỀ DẠY CON VÀ HƯỚNG GIẢI QUYẾT (Trang 47 - 48)