DYNAMIC PROGRAMMING (DP)

 Berbeda dengan Greedy, Dynamic Programming menguji semua kemungkinan solusi secara cerdas dengan memecah masalah menjadi sub-masalah yang tumpang tindih. Karakteristik utama DP:

1.    Overlapping Subproblems (Sub-masalah Tumpang Tindih)

Masalah utama dapat diuraikan menjadi sub-masalah yang lebih kecil, dan sub-masalah yang sama persis dipanggil dan dihitung berulang kali dalam struktur pohon keputusan/rekursi.

2.    Optimal Substructure (Substruktur Optimal)

Solusi optimal dari masalah besar mengandung solusi optimal dari sub-masalahnya.

A. Teknik Utama DP: Memorisasi Vs Tabulasi

Untuk mengeliminasi perhitungan berulang, Dynamic Programming mencatat hasil perhitungan sub-masalah ke dalam tempat penyimpanan (tabel/array). Terdapat dua pendekatan teknis:

1.    Memorasi (Top-Down)

-      Memulai dari masalah utama n.

-      Menggunakan Rekursi + Tabel Memo.

-      Menghitung sub-masalah hanya saat dibutuhkan.

2.    Tabulasi (Bottom-UP)

-      Memulai dari kasus dasar (base cases) paling bawah.

-      Menggunakan Perulangan (Looping) + Tabel 1D/2D secara sekuensial.

B. Studi Kasus 2: Optimasi Kehidupan Sehari-Hari (Penukaran Uang Koin)

Seorang kasir ingin memberikan kembalian belanja sebesar V = 6 rupiah. Pecahan koin yang tersedia adalah {1, 3, 4}. Berapakah jumlah koin minimum yang harus diberikan?

1. Teknik Memorisasi

Analogi: Kamu adalah seorang kasir yang malas menghitung ulang hal yang sama. Setiap kali mendapat jawaban untuk angka tertentu, kamu langsung mencatatnya di Buku Memo.

a.      Memulai dari Target Utama (Uang 6 Rupiah):

    • Kamu ingin tahu: "Berapa koin minimal untuk membuat 6 rupiah?"
    • Untuk menjawabnya, kamu mencoba memilih koin pertama yang mungkin:
      • Jika ambil koin 1: Sisa uang jadi 5.
      • Jika ambil koin 3: Sisa uang jadi 3.
      • Jika ambil koin 4: Sisa uang jadi 2.
  1. Menelusuri Cabang (Tanya ke Bawah):
    • Kamu fokus ke jalur pertama dulu (sisa 5). Untuk menyelesaikan sisa 5, kamu menelusuri koin 1, 3, dan 4 lagi hingga sampai ke titik dasar (0 rupiah = 0 koin).
    • Saat memproses sisa 3 rupiah, kamu menemukan bahwa pilihan terbaik untuk membuat 3 rupiah adalah langsung mengambil 1 koin pecahan 3.

o   Langkah Penting (Mencatat): Sebelum lanjut, kamu langsung menulis di Buku Memo:

"Catatan: Sisa uang 3 rupiah butuh minimal 1 koin."

c.       Mencontek Catatan (Mencegah Hitung Ulang):

    • Saat kamu kembali ke target awal (6) dan ingin mencoba Jalur Kedua (ambil koin 3), sisa uangmu menjadi 3 rupiah.
    • Kali ini kamu tidak perlu menghitung ulang dari awal untuk angka 3! Kamu tinggal membuka Buku Memo, melihat bahwa angka 3 cuma butuh 1 koin, lalu selesai.

d.      Mengambil Keputusan Akhir:

Kamu membandingkan hasil akhir dari ketiga pilihan koin pertama:

o   Pakai koin 1 di awal à butuh 3 koin total.

o   Pakai koin 3 di awal à butuh 2 koin total.

o   Pakai koin 4 di awal  à butuh 3 koin total.

Hasil paling sedikit adalah 2 koin (koin 3 + 3).

2. Teknik Tabulasi (Bottom-Up: Dari Angka Nol Naik ke Atas)

Analogi: Kamu tidak suka menebak-nebak atau bercabang. Kamu memilih membangun Tabel Jawaban secara sistematis, diisi urut satu per satu dari angka 0, 1, 2, 3, 4, 5, hingga 6.

  1. Mengisi Angka Paling Dasar (Uang 0):
    • Kamu tahu pasti bahwa kembalian 0 rupiah membutuhkan 0 koin. Ini jadi fondasi awal tabelmu.
  2. Mengisi Angka 1 dan 2 Secara Berurutan:
    • Uang 1: Pilihan koin hanya 1. Ambil koin 1, sisa uang 0. Kamu intip tabel nilai 0 (nilainya 0). Jadi, 1 + 0 = 1 koin.
    • Uang 2: Pilihan koin hanya 1. Ambil koin 1, sisa uang 1. Kamu intip tabel nilai 1 (nilainya 1). Jadi, 1 + 1 = 2 koin.
  3. Mengisi Angka 3 (Mulai Membandingkan):

Untuk uang 3, ada dua pilihan koin yang muat (1 dan 3):

    • Ambil koin 1 à sisa 2. Lihat tabel nilai 2 (nilainya 2) à 1 + 2 = 3 koin.
    • Ambil koin 3 à sisa 0. Lihat tabel nilai 0 (nilainya 0) à 1 + 0 = 1 koin.
    • Kamu pilih nilai terkecil: 1 koin. Tulis angka 1 di kotak tabel angka 3.
  1. Melanjutkan Pengisian (Angka 4 dan 5):
    • Uang 4: Kamu bandingkan opsi koin 1, 3, dan 4. Pilihan koin 4 memberikan hasil paling kecil, yaitu 1 + {tabel}[0] = 1 koin.
    • Uang 5: Kamu bandingkan koin 1, 3, dan 4 dengan mengintip tabel angka 4, 2, dan 1. Paling kecil menghasilkan 2 koin.
  2. Mencapai Target Akhir (Angka 6):

Saat mengisi kotak target 6, kamu tinggal membandingkan 3 opsi koin pertama menggunakan data tabel yang sudah pasti benar di kotak-kotak sebelumnya:

    • Ambil koin 1 à 1 + {tabel}[5] = 1 + 2 = 3 koin.
    • Ambil koin 3 à 1 + {tabel}[3] = 1 + 1 = 2 koin.
    • Ambil koin 4 à 1 + {tabel}[2] = 1 + 2 = 3 koin.

Nilai terkecil di kotak angka 6 adalah 2 koin.

C. Konsep DP Dengan Efisiensi Sistem Di Dunia Nyata:

1.      Optimasi rute terpendek pada aplikasi peta/navigasi GPS.

2.      Alokasi kapasitas barang pada bagasi/kontainer (Knapsack Problem).

3.      Pemrosesan kemiripan teks pada aplikasi spelling checker atau deteksi plagiarisme (Edit Distance).

Posting Komentar untuk "DYNAMIC PROGRAMMING (DP)"