Outline 1. Definisi 2. Implementasi DP 3. Classical DP 4. Tips Definisi Apa itu Dynamic Programming? ● Dynamic Programming (DP) merupakan strategi penyelesaian masalah dengan cara memecah menjadi beberapa sub masalah yang lebih kecil. ● Skill utama yang diperlukan untuk menguasai teknik ini adalah kemampuan untuk menentukan problem states dan hubungan antara permasalahan saat ini dengan sub permasalahannya. ● DP utamanya digunakan untuk menyelesaikan permasalahan mencari nilai optimal dan menghitung banyak cara. ● Kebanyakan persoalan DP hanya meminta nilai optimalnya/banyak caranya saja. Implementasi DP Overview ● Dalam implementasi dynamic programming, umumnya terdapat dua metode berbeda. ● Kedua metode ini adalah top-down dan bottom-up. ● Meskipun metode ini berbeda, namun solusi yang dikeluarkan selalu optimal dan sama. ● Yang membedakan adalah proses dan resource yang digunakan saat mencari sebuah solusi. ● Terkadang top-down lebih baik dibandingkan bottom-up, namun terkadang bottom-up lebih baik dibandingkan top-down. Hal ini bergantung pada permasalahan yang dihadapi Top-Down (1/2) ● Pendekatan top-down biasa juga disebut memoisasi. ● Kata memoisasi berasal dari "memo", yang artinya catatan. ● Pada top-down, penyelesaian masalah dimulai dari kasus yang besar ● Untuk menyelesaikan kasus yang besar, dibutuhkan solusi dari kasus yang lebih kecil karena solusi kasus yang lebih kecil belum ada, maka kita akan mencarinya terlebih dahulu, lalu mencatat hasilnya. ● Hal ini dilakukan secara rekursif. Top-Down (2/2) ● Top-down merupakan transformasi alami dari rumus rekursif, sehingga biasanya mudah diimplementasikan. ● Urutan pengisian tabel tidak penting dan hanya menghitung nilai dari fungsi jika hanya diperlukan. ● Ketika seluruh tabel memo pada akhirnya terisi, bisa saja lebih lambat karena adanya overhead pemanggilan fungsi. Bottom-Up (1/2) ● Pada bottom-up, penyelesaian masalah dimulai dari kasus yang kecil. ● Ketika merumuskan rumus rekursif, kita mengetahui jawaban kasus yang paling kecil, yaitu base case. Informasi ini digunakan untuk menyelesaikan kasus yang lebih besar. ● Bottom-up biasanya dianalogikan dengan pengisian "tabel DP". ● Berbeda dengan top-down, bottom-up ini dilakukan secara iteratif. Bottom-Up (2/2) ● Bottom-up tidak mengalami perlambatan dari overhead pemanggilan fungsi. ● Bottom-up juga memungkinkan penggunaan teknik DP lanjutan seperti flying table, kombinasi dengan struktur data tree, atau teknik-teknik lanjutan lainnya. ● Namun, Anda harus memikirkan urutan pengisian nilai tabel. ● Selain itu, semua tabel harus diisi nilainya walaupun tidak dibutuhkan akhirnya. Fibonacci ● Fibonacci merupakan salah satu contoh paling umum untuk DP. ● Fibonacci adalah barisan yang didapat dengan menjumlahkan dua suku sebelumnya. ● Beberapa suku pertama dari barisan ini adalah 1, 1, 2, 3, 5, 8, …. ● Maka dari itu, misalkan F(n) adalah barisan fibonacci ke-n, diketahui:
F(n) = F(n - 1) + F(n - 2) untuk n > 1
F(1) = 1
● Terlihat bahwa untuk menghitung F(n) kita perlu menyelesaikan
submasalahnya dahulu yakni F(n - 1) dan F(n - 2). Fibonacci - Top Down Fibonacci - Bottom Up Classical DP Prefix Sum ● Diberikan 105 bilangan dan 105 pertanyaan. ● Setiap pertanyaan, menanyakan hasil penjumlahan bilangan yang berada di indeks ke-L hingga R (inklusif). Coin Change ● Diberikan M jenis koin, masing-masing jenis bernilai a1, a2, ..., aM rupiah. ● Asumsikan banyak nya koin untuk setiap nominal yang ada tak terbatas. ● Tentukan banyaknya koin paling sedikit untuk membayar tepat sebesar N rupiah! ● Sebagai contoh apabila diberi koin 1, 6, dan 10 rupiah. Maka solusi terbaik untuk mendapatkan 12 rupiah adalah menggunakan 2 koin 6 rupiah. ● Berbeda halnya dengan greedy yang akan menggunakan 2 koin 1 rupiah dan 1 koin 10 rupiah, dimana ini tidak optimal. 0-1 Knapsack ● Diberikan N buah barang, dinomori dari 1 sampai N. Barang ke-i memiliki harga vi rupiah dan berat wi gram. Kita memiliki tas yang berkapasitas G gram. ● Kita ingin memasukkan beberapa barang ke dalam tas, sedemikian sehingga jumlah berat dari barang-barang yang kita masukan tidak lebih dari kapasitas tas dan jumlah harganya sebanyak mungkin. ● Solusi terbaik untuk kapasitas 14 dan daftar benda di samping adalah mengambil barang ke 1, 2, dan 5. Tips Kapan menggunakan DP? 1. Terdapat subproblem yang overlapping. 2. Saat solusi optimal dari masalah saat ini dapat dibentuk dari solusi optimal sub masalahnya. 3. Saat ditanyakan banyak cara, namun memiliki terlalu banyak syarat. 4. Saat ragu dengan metode greedy atau terbukti tidak dapat diselesaikan dengan greedy. 5. Saat dimensi DP nya memang mencukupi. Bagaimana merumuskan DP? 1. Tentukan statenya dengan mencari hal-hal yang mempengaruhi hasil, misalnya panjang sekuens, digit terakhir, tipe, dsb. 2. Definisikan dengan detail fungsinya. 3. Rumuskan relasi sesuai definisi sebelumnya dengan melihat efek yang dibutuhkan pada kasus sebelumnya atau selanjutnya seperti apa. 4. Tentukan base casenya DP Uhuyyyy Soal #1 Akan dibangun sebuah gedung dengan tinggi 10 kilometer. Namun, tinggi tiap lantai yang akan dibangun terbatas pada tinggi 2, 3, dan 5 kilometer saja. Berapa banyak variasi gedung yang dapat dibangun? Soal #2 Banyak bilangan basis-4 yang hasil jumlah digitnya 10 adalah... Soal #3 Seekor katak ingin menyeberang sungai. Terdapat dua jenis benda, yaitu batu dan daun. Hanya batu yang dapat ditempati katak. Seekor katak dapat melompat ke benda tepat di depannya atau dapat melompatinya (dengan kata lain, menempati benda kedua yang ada di depannya). Berapa banyak cara yang bisa ditempuh katak untuk menyeberangi sungai dengan selamat jika konfigurasi benda di sungai adalah sebagai berikut (katak menyeberang dari kiri ke kanan) Soal #4 Pak Dengklek membawa bebeknya ke suatu goa yang petanya sebagai berikut. Lingkaran adalah ruangan, dan arah panah menunjukkan lorong untuk mencapai suatu ruangan dari sebuah ruangan. Angka menunjukkan jumlah permata dalam setiap ruangan.
Berapa maksimum permata yang dapat
dikumpulkan mulai dari pintu masuk (kiri bawah) sampai keluar (Kanan atas)? Soal #5 Berapa banyak kata sepanjang N-karakter yang dapat dibentuk dari angka-angka {0, 1, 2}, sedemikian sehingga angka-angka yang saling bersebelahan hanya berselisih maksimum 1. Contoh : Untuk N=2 terdapat 7 kata yang dapat dibentuk yaitu : <0 0>, <0 1>, <1 0>, <1 1>, <1 2>, <2 1>, <2 2>. Notasi < > menyatakan bentukan satu kata. Jika N=10, berapa banyak kata yang dapat dibentuk? Soal #5 Pak Dengklek sedang menyusun ubin untuk menutupi lantai berukuran 4x7 dengan ubin berukuran 1x2. Ubin boleh disusun vertikal atau horisontal tanpa memotongnya. Ada berapa banyak cara untuk memenuhi lantai tersebut?