Kami biasanya menerapkan pemrograman dinamis untuk masalah optimasi. Setiap solusi
memiliki nilai, dan kami ingin menemukan solusi dengan nilai optimal (minimum atau maksimum).
Kami menyebut solusi tersebut sebagai solusi optimal untuk masalah, berlawanan dengan solusi
optimal, karena mungkin ada beberapa solusi yang mencapai nilai optimal.
Saat mengembangkan algoritma pemrograman dinamis, kita mengikuti urutan empat langkah:
1. Mencirikan struktur solusi yang optimal.
2. Secara rekursif definisikan nilai solusi yang optimal.
3. Hitung nilai solusi optimal, biasanya dengan cara bottom-up.
4. Buat solusi optimal dari informasi yang dihitung.
Langkah 1-3 membentuk dasar solusi pemrograman dinamis untuk sebuah masalah. Jika kita
hanya membutuhkan nilai solusi optimal, dan bukan solusinya sendiri, maka kita bisa menghilangkan
langkah 4. Ketika kita melakukan langkah 4, terkadang kita menjaga informasi tambahan selama
langkah 3 sehingga kita dapat dengan mudah membuat solusi optimal.
-Menghancurkan solusi
Solusi pemrograman dinamis kami untuk mengatasi masalah pemotongan batang
mengembalikan nilai solusi optimal, namun solusi tersebut tidak mengembalikan solusi aktual: daftar
ukuran potongan. Kita dapat memperluas pendekatan pemrograman dinamis untuk mencatat tidak
hanya nilai optimal yang dihitung untuk setiap subproblem, namun juga pilihan yang mengarah pada
nilai optimal. Dengan informasi ini, kami dapat dengan mudah mencetak solusi optimal.
-Optimal substruktur
Ingatlah bahwa masalah menunjukkan substruktur optimal jika solusi optimal untuk masalah
mengandung solusi optimal untuk subproblems.
Anda akan menemukan diri Anda mengikuti pola umum dalam menemukan substruktur yang
optimal:
1. Anda menunjukkan bahwa solusi untuk masalah terdiri dari membuat pilihan, seperti memilih
potongan awal pada batang atau memilih indeks untuk membagi rantai matriks.
2. Anda mengira bahwa untuk masalah tertentu, Anda diberi pilihan yang mengarah pada solusi
optimal. Anda belum mempedulikan diri Anda dengan bagaimana menentukan pilihan ini.
3. Dengan pilihan ini, Anda menentukan submasalahnya dan bagaimana cara terbaik untuk
mencirikan ruang subproblem yang dihasilkan.
4. Anda menunjukkan bahwa solusi untuk subproblem yang digunakan dalam solusi optimal
untuk masalah itu sendiri harus optimal dengan menggunakan teknik "cut-and-paste".
Substruktur optimal bervariasi di seluruh domain masalah dengan dua cara:
1. berapa banyak subproblems solusi optimal untuk penggunaan masalah asli, dan
2. Berapa banyak pilihan yang kita miliki dalam menentukan subproblem (s) yang akan
digunakan dalam solusi optimal.
Secara informal, waktu berjalan dari algoritma pemrograman dinamis bergantung pada produk
dua faktor: jumlah subproblem keseluruhan dan berapa banyak pilihan yang kita lihat untuk setiap
subproblem.
-Memoisasi
Idenya adalah untuk memoize algoritma rekursif yang natural, tapi tidak efisien. Algoritma
rekursif yang memoisasi mempertahankan sebuah entri dalam sebuah tabel untuk solusi terhadap
setiap subproblem. Ketika subproblem pertama kali ditemukan sebagai algoritma rekursif yang
terbentang, solusinya dihitung dan kemudian disimpan di tabel. Setiap kali kita menghadapi
subproblem ini, kita hanya melihat nilai yang tersimpan di tabel dan mengembalikannya.
-Meningkatkan kode
Beberapa perubahan dapat menyederhanakan kode dan memperbaiki faktor konstan namun
sebaliknya tidak menghasilkan perbaikan kinerja asimtotik. Orang lain dapat menghasilkan
penghematan asimtotik yang substansial dalam ruang dan waktu.