Gần đây tôi đã bắt gặp câu hỏi này: "Bạn được cung cấp một biểu thức boolean bao gồm một chuỗi các ký hiệu 'true', 'false', 'và', 'hoặc' và 'xor'. Đếm số cách để ngoặc đơn biểu hiện sao cho nó sẽ đánh giá là đúng. Ví dụ: có hai cách để ngoặc đơn 'true và false xor true' sao cho nó đánh giá là đúng. "
Tôi biết đó là một vấn đề lập trình động nên tôi đã cố gắng tự mình đưa ra giải pháp như sau. Giả sử chúng ta có một biểu thức là ABC .... D trong đó '.' đại diện cho bất kỳ hoạt động nào và, hoặc, xor và chữ in hoa đại diện cho đúng hoặc sai. Hãy nói rằng số cách để biểu thức kích thước K này tạo ra đúng là N. khi giá trị boolean E mới được thêm vào biểu thức này có 2 cách để ngoặc đơn cho biểu thức mới này 1. ((ABC .... D) .E) tức là. với tất cả các dấu ngoặc đơn có thể có của ABC .... D chúng ta thêm E vào cuối. 2. (ABC (DE)) tức là. đánh giá DE trước và sau đó tìm số cách biểu thức kích thước K này có thể tạo ra đúng.
giả sử T [K] là số cách biểu thức có kích thước K tạo ra đúng thì T [k] = val1 + val2 + val3 trong đó val1, val2, val3 được tính như sau.
1) khi E được nhóm với D.
i) Nó không thay đổi giá trị của D
ii) nó đảo ngược giá trị của D
trong trường hợp đầu tiên val1 = T [K] = N. (Vì điều này giảm xuống biểu thức ABC ... D ban đầu). Trong trường hợp thứ hai, đánh giá lại dp [K] với giá trị của D đảo ngược và đó là val1.
2) khi E được nhóm với toàn bộ biểu thức.
// val2 chứa số 'true' E sẽ tạo ra với các biểu thức cho 'true' trong số tất cả các trường hợp được ngoặc đơn của ABC ...... D i) if true.E = true thì val2 = N
ii) nếu đúng.E = false thì val2 = 0
// val3 chứa số 'true' E sẽ tạo ra với các biểu thức cho 'false' trong số tất cả các trường hợp được ngoặc đơn của ABC ...... D
iii) nếu sai.E = true thì val3 = (2 ^ (K-2) - N) = M tức là. số cách biểu thức có kích thước K tạo ra sai [2 ^ (K-2) là số cách để ngoặc đơn cho một biểu thức có kích thước K].
iv) nếu sai.E = false thì val3 = 0
Đây là ý tưởng cơ bản tôi có trong đầu nhưng khi tôi kiểm tra giải pháp của mình http://people.csail.mit.edu/bdean/6.046/dp/dp_9.swf cách tiếp cận hoàn toàn khác. Ai đó có thể cho tôi biết tôi đang làm gì sai không và làm thế nào tôi có thể giải quyết DP tốt hơn để tôi có thể đưa ra các giải pháp như giải pháp được đưa ra ở trên.
Cảm ơn trước.
true and (false xor true) = (true and false) xor true
(dễ dàng nhìn thấy bằng cách giảm cả hai xuốngfalse xor true
).