1. Trang chủ
  2. » Tất cả

Quy hoạch động chữ số dp digit

6 1,4K 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 6
Dung lượng 23,33 KB

Nội dung

QUY HOẠCH ĐỘNG CHỮ SỐ I ĐẶT VẤN ĐỀ Có rất nhiều dạng bài toán yêu cầu đếm số lượng các số nguyên k trong phạm vi từ A đến B và thỏa mãn một tính chất cụ thể có thể liên quan đến các chữ số của nó Thuậ.

QUY HOẠCH ĐỘNG CHỮ SỐ I ĐẶT VẤN ĐỀ Có nhiều dạng toán yêu cầu đếm số lượng số nguyên k phạm vi từ A đến B thỏa mãn tính chất cụ thể liên quan đến chữ số nó.Thuật tốn đơn giản chung cho tốn là: ● Nhập A, B ● Dem = ● Với k chạy từ A đến B: ○ Nếu k thoả mãn tăng Dem ● Xuất Dem Độ phức tạp: lớn O(B) việc kiểm tra số k thoả mãn hay không tốn thêm thời gian Nếu B lớn (chẳng hạn tới 10 18) khơng thể chạy thời gian cho phép Cách khác ta sử dụng kĩ thuật quy hoạch động chữ số II Ý TƯỞNG CHÍNH Gọi G(x) số lượng số nguyên phạm vi từ đến x, đáp án bải toán G(B)-G(A-1) Như vậy, ta cần viết hàm G(x) Giả sử số x có n chữ số Chẳng hạn, ta có x= a n-1an-2… a2a1a0, (0 ≤ i ≤ n-1) cho biết chữ số thứ i tính từ bên phải Chữ số tận bên trái a n chữ số có nghĩa Khi đó, giả sử số k ≤ x k có dạng k = t n-1tn-2… t2t1t0, có điều kiện ràng buộc sau:     ≤ tn-1 ≤ an-1 ≤ tn-2 ≤ an-2 tn-1 = an-1, ngược lại ≤ tn-2 ≤ ≤ tn-3 ≤ an-3 tn-1 = an-1 vàtn-2 = an-2, ngược lại ≤ tn-3 ≤ … Tổng quát: ≤ ti ≤ tj = aj, j=i+1 n-1, ngược lại ≤ ti ≤ Như vậy, chữ số ti bị giới hạn (0 ≤ ti ≤ ai) không bị giới hạn (0 ≤ ti ≤ 9) Điều kiện để ti bị giới hạn là: ti+1 = ai+1, ti+2 = ai+2, …, tn-1 = an-1 Hay nói cách khác: ti bị giới hạn ti+1 bị giới hạn ti+1 đạt đến giới hạn (tức ti+1=ai+1) Hàm hàm đệ quy thu(i,…), hàm quay lui để thử khả chữ số thứ i (tức t i) Với giá trị t i, ta gọi đệ quy đến thu(i-1,…) Bằng cách gọi thu(n-1,…), ta sinh số k phạm vi từ đến x Với số sinh ra, ta kiểm tra có thoả mãn tính chất đề u cầu hay khơng, có tăng kết thêm Với cách này, số trường hợp sinh lớn Tuy nhiên, có nhiều trường hợp hàm tham số giống (gọi trạng thái) gọi nhiều lần Ta khắc phục cách dùng mảng để lưu trạng thái Nếu gặp lại, ta khơng cần tính lại mà lấy kết lưu mảng (người ta gọi kĩ thuật đệ quy có nhớ) Giá trị hàm thu(i,…) số lượng số thoả mãn đề có chữ số từ n-1 i+1, mà giá trị chữ số đại diện nhiều tham số thêm vào (tuỳ thuộc vào toán) Mẫu chung cho hàm sau: Khai báo mảng a[] để lưu chữ số x biến n số chữ số Khai báo mảng F[i][…] để lưu trạng thái //số chiều tuỳ thuộc vào toán Ban đầu, mảng F[i][…] gán -1 hết, tức trạng thái chưa tính Hàm thu(i, gh, …) //Thử trường hợp cho chữ số thứ i; có giới hạn hay không (gh=true hay false) Các tham số khác tuỳ toán.Chữ số thứ i bị giới hạn nhận giá trị từ a[i], cịn khơng, nhận giá trị từ Hàm thu(i, gh, …) ● Nếu i < thì: ○ Nếu số sinh thoả mãn điều kiện trả 1; ○ Ngược lại, trả 0; ● Nếu gh=false F[i][ ] >= trả F[i][ ] //nếu trạng thái tính trước lấy kết từ mảng lưu kết trạng thái ● kq = 0; ● maxc = (gh=true ? a[i] : 9); //giá trị tối đa mà chữ số thứ i đạt ● Với c chạy từ đến maxc: //cho chữ số thứ i c ○ ghm = (gh = true) AND (c = maxc) //giới hạn chữ số thứ i-1 ○ kq += thu(i-1, ghm, …) //gọi đệ quy đến chữ số phía sau ● Nếu gh=false F[i][ ]=kq; //lưu kết trang thái để lần sau dùng ● Trả kq; Hàm G(x): ● n=0; ● a[0]=0; ● Trong x > ○ a[n] = x mod 10; //tách lưu chữ số đơn vị x vào a[n] ○ x = x div 10; //xoá chữ số đơn vị x ○ n = n + 1; ● Trả thu(n-1, true, ) //chữ số thứ n-1 bị giới hạn Hàm main() //chương trình ● Nhập A, B ● Cho F[i][ ] = -1 hết //fillchar memset ● Xuất G(B)-G(A-1) Đánh giá độ phức tạp thời gian: Thời gian tiêu tốn nhiều cho việc gọi trạng thái Do đó, số trạng thái tích số khả tham số hàm thu(i,gh,…) Trong trạng thái, có vòng lặp chạy tối đa 10 lần Vậy số lần gọi trạng thái tối đa 10 * tích số khả tham số hàm thu(i,gh,…) Sau đây, xét số toán cụ thể III MỘT SỐ BÀI TOÁN MẪU Bài tốn 1: Số có tổng chữ số số nguyên tố https://www.spoj.com/problems/GONE/ Có số từ A đến B mà tổng chữ số số nguyên tố Input (tệp TNT.INP) Hai số A, B (0 B; cout

Ngày đăng: 25/02/2023, 13:35

w