My first Magazine pemrograman-kompetitif-dasar | Page 87
7.2 Contoh-contoh DP Sederhana
Perhatikan bahwa untuk pemotongan pertama, terdapat N pilihan lokasi pemotongan. Jika
kita memotong di posisi L m , maka didapatkan dua batang, yang mana batang pertama perlu
dipotong di titik L 1 , L 2 , ..., L m−1 dan batang kedua di L m+1 , L m+2 , ..., L N . Dari sini kita mendapatkan
subpersoalan yang serupa. Pemotongan bisa dilanjutkan secara rekursif, dan kita pilih posisi
pemotongan yang ke depannya membutuhkan usaha terkecil.
...
l-1
l
m-1 m
m+1
r r+1
...
Gambar 7.5: Penomoran posisi pemotongan kayu.
Definisikan sebuah fungsi d p(`, r) sebagai jumlah usaha minimum yang mungkin diperoleh,
jika kita hanya perlu memotong di L ` , L `+1 , ..., L r . Untuk kemudahan, asumsikan pula L 0 = 0 dan
L N+1 = M. Untuk menghitung d p(`, r) kita dapat mencoba titik mana yang kita potong pertama
kali. Jika kita memotong di L m (` ≤ m ≤ r), maka kita akan mendapatkan dua potongan.
Dengan demikian, total usaha yang dibutuhkan jika kita melakukan pemotongan di L m adalah
jumlah dari:
• Total usaha minimum dari potongan pertama, yaitu d p(`, m − 1).
• Total usaha minimum dari potongan kedua, yaitu d p(m + 1, r).
• Usaha untuk pemotongan ini, yaitu L r+1 − L `−1 .
Ketika ` > r, artinya sudah tidak ada pemotongan yang perlu dilakukan. Usaha yang dibu-
tuhkan untuk kasus ini adalah 0, atau d p(`, r) = 0.
Dengan demikian, kita dapat merumuskan nilai DP sebagai berikut:
(
d p(`, r) =
0,
`> r
min d p(`, m − 1) + d p(m + 1, r) + (L r+1 − L `−1 ), ` ≤ r
`≤m≤r
Analisis Kompleksitas
Terdapat O(N) nilai berbeda untuk nilai ` dan O(N) nilai berbeda untuk nilai r pada d p(`, r).
Dibutuhkan iterasi sebanyak O(N) untuk menghitung d p(`, r). Sehingga untuk menghitung seluruh
nilai d p(`, r) untuk seluruh ` dan r dibutuhkan waktu O(N 3 ).
Solusi Top-Down
Kita implementasikan d p(`, r) sebagai fungsi SOLVE (`, r).
77