Làm thế nào để bạn xác định một vấn đề là phù hợp cho lập trình động?


19

Tôi đã đọc lên chương trình năng động gần đây. Muốn nghe từ một người bắt đầu từ đầu và bây giờ khá giỏi trong việc xác định và giải quyết các vấn đề DP. Tôi đang vật lộn trong việc xác định những vấn đề này là DP và đóng khung một giải pháp ngắn gọn.

Tôi đã trải qua hầu hết các vấn đề DP mới bắt đầu và tài nguyên MIT, v.v.

Câu trả lời:


17

Tôi đến từ một nền tảng vật lý, và do đó, rất nhiều toán học. Tôi thấy dễ dàng phát hiện ra các vấn đề rất phù hợp với các giải pháp lập trình đệ quy / động bằng cách tìm các điểm tương đồng với bằng chứng bằng cảm ứng .

Bằng chứng bằng cảm ứng, bạn có hai phần:

  • bạn chứng minh rằng nếu điều gì đó đúng với lần lặp N, thì điều đó cũng đúng với lần lặp N + 1
  • bạn chứng minh rằng điều đó đúng với phép lặp 1

Trong lập trình đệ quy / lập trình động:

  • bạn xác định một điều kiện thoát (ví dụ: bạn cứng cáp giải pháp cho lần lặp 1)
  • bạn tính toán giải pháp cho lần lặp N đưa ra giải pháp cho lần lặp N-1

Vì vậy, như những người khác trả lời, đó là vấn đề kinh nghiệm và chọn gợi ý, nhưng bạn có thể sử dụng lại các kỹ năng khác để hướng dẫn bạn. Sau đó, bạn cần luôn có hai phần mà tôi đã đề cập: nếu bạn không, thì nó sẽ không hoạt động.

Ví dụ: để tạo tất cả các hoán vị của một tập hợp:

  • điều kiện thoát: nếu bạn chỉ có một phần tử, trả lại nó
  • đệ quy: hoán vị của một tập hợp N vật phẩm là N tập hợp hoán vị bạn có được bằng cách chọn từng phần tử và kết hợp với tất cả các tập hợp N-1 của (nhiều) hoán vị của tập hợp con bạn nhận được bằng cách loại bỏ phần tử.

8

Hầu hết các vấn đề lập trình động có thể được giải quyết thông qua ghi nhớ. Ghi nhớ thường là trực quan hơn và dễ viết mã hơn. Bạn có thể thấy hữu ích khi suy nghĩ về mặt ghi nhớ thay vì DP.

Thông thường dễ dàng hơn để xem liệu một vấn đề có phù hợp với việc ghi nhớ hay không (các bước giống như câu trả lời của Slivvz , nhưng tôi nghĩ rằng sự thay đổi tinh thần ngắn hơn một chút). Tuy nhiên, khi bạn đã giải quyết vấn đề thông qua ghi nhớ, bạn có thể kiểm tra xem bộ nhớ cache của bạn được điền như thế nào và sau đó điền theo thứ tự, mà không cần đệ quy ... làm thay đổi thuật toán của bạn thành thuật toán lập trình động.

TL; DR; phiên bản: Bạn có thể thấy dễ dàng hơn để hiểu lập trình động về mặt ghi nhớ.

Xem thêm StackOverflow: Lập trình động và ghi nhớ: tiếp cận từ dưới lên so với từ trên xuống .


4

Lập trình động là định nghĩa về hai điều:

  1. Cấu trúc tối ưu
    Các giải pháp lớn hơn có thể được lấy từ các giải pháp nhỏ hơn; giải quyết không phải là hai chiều.


  2. Các bài toán con chồng chéo Các giải pháp nhỏ sẽ được sử dụng lại nhiều lần. Nếu các bài toán con hoàn toàn không trùng lặp, thì bạn không được hưởng lợi từ DP / phân biệt; Thay vào đó, những gì bạn có là phân chia và chinh phục .

Cách tiếp cận chung cho các vấn đề DP là:

  • Viết một phiên bản đệ quy ngây thơ hoặc lặp đi lặp lại hoạt động.

  • Lưu ý rằng các chức năng đang làm công việc dư thừa.

  • Tìm cách để tránh làm công việc dư thừa đó, thường là do sự phân biệt.


Tất cả những điều này là đúng từ quan điểm lý thuyết. IMO cần thực hành thêm một chút để quen thuộc hơn khi nhận dạng nhanh :)
user110036

2

Tôi chưa bao giờ triển khai một bộ giải lập trình động duy nhất - nền tảng của tôi được áp dụng toán học / vật lý / điện toán số, không phải CS - cho đến vài năm trước khi tôi bắt đầu thực hiện các bài toán Project Euler . Các vấn đề có thể giải quyết được ở đó (ví dụ 76 , 158 , 161 , 242, nhưng có nhiều hơn nữa) hóa ra là khá nhiều loại yêu thích của tôi. Bạn chắc chắn trở nên tốt hơn khi phát hiện ra khi đó sẽ là một kỹ thuật hữu ích: về cơ bản hãy tìm kiếm những thứ mà dường như chúng có thể được giải quyết bằng một cách tiếp cận đệ quy, chia rẽ và chinh phục trong đó cũng có thể chế ngự sự bùng nổ của những con đường cần được khám phá bằng cách nhận ra các bài toán con định kỳ và sử dụng lại các kết quả được tính toán trước đó; có thể xác định vectơ trạng thái tối thiểu để ghi nhớ - và "lịch sử" không liên quan có thể bị xóa - là bước quan trọng.

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.