Một đồng nghiệp làm việc về lập trình di truyền đã hỏi tôi câu hỏi sau đây. Lần đầu tiên tôi đã cố gắng giải quyết nó dựa trên một cách tiếp cận tham lam, nhưng trên một ý nghĩ thứ hai, tôi đã tìm thấy một ví dụ cho thuật toán tham lam. Vì vậy, tôi nghĩ rằng nó đáng được đề cập ở đây.
Xét hai đa thức được biểu thị bằng cây biểu thức của chúng. Chẳng hạn, và được minh họa bên dưới:
Quy tắc:
- Mỗi nút là một tên biến ( ), một số hoặc một hoạt động (+, -, ×).
- Việc truyền tải theo thứ tự của cây sẽ dẫn đến một đa thức hợp lệ.
- Các nút hoạt động có mức độ 2. Các nút khác có mức độ 0. Tất cả các nút có mức độ 1 (ngoại trừ gốc, có mức độ bằng 0).
Trên một nút N của cây, xác định thao tác cơ bản như sau:
- Một hoạt động cơ bản có thể thay đổi nhãn của nút. Chẳng hạn, có thể thay đổi thành 3 hoặc + có thể thay đổi thành .
- Một hoạt động cơ bản có thể xây dựng một cây biểu thức trên đầu N (xem ví dụ bên dưới).
Chi phí cho hoạt động cơ bản của loại 1 là 1. Chi phí cho loại 2 bằng với số lượng hoạt động {+, -, ×} trong cây biểu thức mới được xây dựng.
Ví dụ cho loại 2: Chi phí của hoạt động cơ bản sau là 2, do cây biểu thức được xây dựng trên đỉnh nút N sử dụng hai hoạt động (- và ×).
Đặt T1 và T2 là hai cây biểu thức đại diện cho đa thức. Xác định khoảng cách của T1 và T2 như sau: chi phí tối thiểu cho các hoạt động cơ bản để chuyển đổi T1 sang T2. Lưu ý rằng chúng tôi không yêu cầu cây được chuyển đổi có cùng cấu trúc với T2. Chúng tôi chỉ muốn nó tính toán đa thức giống như T2. (Xem các bình luận cho một ví dụ.)
Vấn đề: Đưa ra T1 và T2, trình bày một thuật toán tính khoảng cách của chúng.
Ví dụ 1: Gọi T1 và T2 là hai cây được minh họa ở đầu bài này. Để chuyển đổi cây bên phải sang cây bên trái, người ta có thể xây dựng một cây có giá 3 trên đỉnh × và thay đổi 4 thành 1 (tổng chi phí là 4).