Lập trình động cung cấp cho bạn một cách để suy nghĩ về thiết kế thuật toán. Điều này thường rất hữu ích.
Phương pháp ghi nhớ và từ dưới lên cung cấp cho bạn một quy tắc / phương pháp để biến quan hệ lặp lại thành mã. Ghi nhớ là một ý tưởng tương đối đơn giản, nhưng những ý tưởng tốt nhất thường là!
Lập trình động cung cấp cho bạn một cách có cấu trúc để suy nghĩ về thời gian chạy thuật toán của bạn. Thời gian chạy về cơ bản được xác định bởi hai số: số lượng các bài toán con bạn phải giải và thời gian cần thiết để giải từng bài toán con. Điều này cung cấp một cách dễ dàng thuận tiện để suy nghĩ về vấn đề thiết kế thuật toán. Khi bạn có mối quan hệ lặp lại của ứng viên, bạn có thể xem xét nó và nhanh chóng hiểu được thời gian chạy có thể là gì (ví dụ, bạn thường có thể nhanh chóng cho biết sẽ có bao nhiêu bài toán con, giới hạn thấp hơn về thời gian hoạt động, nếu có nhiều bài toán con bạn phải giải theo cấp số nhân, thì việc tái phát có lẽ sẽ không phải là một cách tiếp cận tốt). Điều này cũng giúp bạn loại trừ phân rã ứng viên phụ. Chẳng hạn, nếu chúng ta có một chuỗi , xác định một bài toán con bằng tiền tố S [ 1 .. i ] hoặc hậu tố S [ j . . n ] hoặc chuỗi con S [ i . . j ] có thể hợp lý (số lượng các bài toán con là đa thức trong n ), nhưng việc xác định một bài toán con bằng một phần tiếp theo của S không có khả năng là một cách tiếp cận tốt (số lượng các bài toán con là theo cấp số nhân trong n ). Điều này cho phép bạn cắt tỉa "không gian tìm kiếm" của các đợt tái phát có thể xảy ra.S[1..n]S[1..i]S[j..n]S[i..j]nSn
Lập trình động cung cấp cho bạn một cách tiếp cận có cấu trúc để tìm kiếm các mối quan hệ tái phát của ứng viên. Theo kinh nghiệm, phương pháp này thường hiệu quả. Cụ thể, có một số phương pháp phỏng đoán / mẫu chung mà bạn có thể nhận ra đối với các cách phổ biến để xác định các bài toán con, tùy thuộc vào loại đầu vào. Ví dụ:
Nếu đầu vào là một số nguyên dương , một ứng cử viên cách để xác định một bài toán con là bằng cách thay thế n với một số nguyên nhỏ hơn n ' (st 0 ≤ n ' ≤ n ).nnn′0≤n′≤n
Nếu đầu vào là một chuỗi , một số cách ứng cử viên để xác định một bài toán con bao gồm: thay S [ 1 .. n ] bằng tiền tố S [ 1 .. i ] ; thay S [ 1 .. n ] bằng hậu tố S [ j . . n ] ; thay S [ 1 .. n ] bằng chuỗi con S [ i . . j ]S[1..n]S[1..n]S[1..i]S[1..n]S[j..n]S[1..n]S[i..j]. (Ở đây, bài toán con được xác định bởi sự lựa chọn của .)i,j
Nếu đầu vào là một danh sách , hãy làm tương tự như bạn làm cho một chuỗi.
Nếu đầu vào là cây , một cách ứng cử viên để xác định một bài toán con là thay thế T bằng bất kỳ cây con nào của T (nghĩa là chọn một nút x và thay thế T bằng cây con gốc ở x ; biểu đồ con được xác định bởi sự lựa chọn của x ).TTTxTxx
Nếu đầu vào là một cặp , thì hãy xem xét đệ quy loại x và loại y để xác định cách chọn một bài toán con cho mỗi bài. Nói cách khác, một ứng cử viên cách để xác định một bài toán con là để thay thế ( x , y ) bởi ( x ' , y ' ) nơi x ' là một bài toán con cho x và y ' là một bài toán con cho y . (Bạn cũng có thể xem xét các biểu tượng con của biểu mẫu ( x , y(x,y)xy(x,y)(x′,y′)x′xy′y Hoặc ( x ' , y ) .)(x,y′)(x′,y)
Và như vậy. Điều này cung cấp cho bạn một heuristic rất hữu ích: chỉ cần nhìn vào chữ ký loại của phương thức, bạn có thể đưa ra một danh sách các cách ứng cử viên để xác định các bài toán con. Nói cách khác, chỉ bằng cách xem báo cáo vấn đề - chỉ nhìn vào các loại đầu vào - bạn có thể đưa ra một số cách ứng cử viên để xác định một bài toán con.
Điều này thường rất hữu ích. Nó không cho bạn biết mối quan hệ lặp lại là gì, nhưng khi bạn có một lựa chọn cụ thể về cách xác định bài toán con, thường thì không quá khó để tìm ra mối quan hệ lặp lại tương ứng. Vì vậy, nó thường biến thiết kế của một thuật toán lập trình động thành một trải nghiệm có cấu trúc. Bạn viết ra giấy phế liệu một danh sách các cách ứng cử viên để xác định các bài toán con (sử dụng phương pháp phỏng đoán ở trên). Sau đó, đối với mỗi ứng cử viên, bạn cố gắng viết ra một mối quan hệ lặp lại và đánh giá thời gian chạy của nó bằng cách đếm số lượng các bài toán con và thời gian dành cho mỗi bài toán con. Sau khi thử từng ứng cử viên, bạn giữ một ứng cử viên tốt nhất mà bạn có thể tìm thấy. Cung cấp một số cấu trúc cho quy trình thiết kế thuật toán là một trợ giúp lớn, vì nếu không thì thiết kế thuật toán có thể đáng sợ (có '