Làm thế nào để giải quyết vấn đề lập trình động tốt hơn


9

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.


Câu hỏi sai. 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ống false xor true).
Peter Taylor

Câu hỏi tuyệt vời! Tôi cũng phải trở nên tốt hơn với DP. Một số người nói "ah .. DP chỉ là một đệ quy đơn giản". Nó không thể!
Florents Tselai

@Florents Tselai vừa thấy bình luận của bạn. Tại sao bạn nghĩ rằng nó không phải là?
John Donn

Câu trả lời:


9

Câu trả lời, như với nhiều thứ, là:

Thực hành thực hành thực hành.

Nhân tiện, tôi tin rằng trong giải pháp của bạn, bạn đã đi vào ngõ cụt bằng cách phạm một lỗi nhỏ tầm thường từ rất sớm: "Có 2 cách để ngoặc đơn cho biểu thức mới này" - không có nhiều hơn 2 sao? Làm thế nào về (A.B.(C.D.E)), ví dụ?


"Làm thế nào để tôi trở nên tốt hơn khi làm X?" - "Làm X!" ... Nghe có vẻ hợp lý ;-)
Joachim Sauer

2

Tôi đồng ý với điều kiện thực tế là bắt buộc nhất, cũng muốn nói thêm rằng bạn cần chú ý trong việc nhận ra các mô hình trong các vấn đề có thể được giải quyết bằng DP (điều này được giải thích khá rõ trong CLRS)

Bạn có thể tìm thấy các vấn đề spoj liên quan đến lập trình động ở đây :)


vui lòng bình luận trước khi downvote để tôi có thể cải thiện :)
nischayn22

liên kết đó không hoạt động!
deebee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.