Saya berasal dari latar belakang fisika, dan dengan demikian, banyak matematika. Saya menemukan masalah yang mudah dikenali cocok untuk solusi pemrograman rekursif / dinamis dengan menemukan kesamaan dengan bukti dengan induksi .
Dibuktikan dengan induksi Anda memiliki dua bagian:
- Anda membuktikan bahwa jika sesuatu benar untuk iterasi N, itu juga berlaku untuk iterasi N +1
- Anda membuktikan bahwa itu benar untuk iterasi 1
Dalam pemrograman rekursif / pemrograman dinamis:
- Anda mengidentifikasi kondisi keluar (misalnya, Anda memasang solusi untuk iterasi 1)
- Anda menghitung solusi untuk iterasi N yang diberikan solusi untuk iterasi N-1
Jadi, ketika orang lain menjawab, itu adalah masalah pengalaman dan mengambil petunjuk, tetapi Anda dapat menggunakan kembali keterampilan lain untuk membimbing Anda. Setelah itu, Anda harus selalu memiliki dua bagian yang saya sebutkan: jika tidak, maka tidak akan berfungsi.
Misalnya, untuk menghasilkan semua permutasi dari set:
- kondisi keluar: jika Anda hanya memiliki satu elemen, kembalikan
- rekursi: permutasi dari set item N adalah set permutasi N yang Anda dapatkan dengan memilih setiap elemen dan menggabungkan semua set N-1 dari (banyak) permutasi dari subset yang Anda dapatkan dengan menghapus elemen tersebut.
Saya tidak pernah menerapkan pemecah pemrograman dinamis tunggal - latar belakang saya adalah matematika / fisika / komputasi numerik, bukan CS - sampai beberapa tahun yang lalu ketika saya mulai melakukan masalah Project Euler . Masalah yang dapat dipecahkan oleh DP di sana (mis. 76 , 158 , 161 , 242, tapi ada banyak lagi) ternyata jenis favorit saya. Anda benar-benar mendapatkan lebih baik dalam bercak ketika itu akan menjadi teknik yang berguna: pada dasarnya mencari hal-hal yang tampaknya dapat diselesaikan dengan semacam pendekatan rekursif, divide-and-conquer di mana juga memungkinkan untuk menjinakkan ledakan jalur yang membutuhkan untuk dieksplorasi dengan mengenali subproblem berulang dan menggunakan kembali hasil yang dihitung sebelumnya; mampu mengidentifikasi vektor keadaan minimal untuk digunakan - dan "sejarah" yang tidak relevan dapat dihapus - adalah langkah penting.
sumber