OSP kurang dari seminggu lagi dan dengan semakin seringnya muncul soal tipe ini,ingin mencoba membahasnya. Kata orang kalau kita ngajarin orang lain jadi tambah ngerti maka jadilah post ini :v
(untuk alasan lupa dan kurangnya niat mencari soal asli, beberapa soal di post ini mungkin memiliki deskripsi berbeda dengan soal aslinya)
Pendahuluan
“banyaknya string biner dengan panjang 8 dimana tidak ada 2 angka 1 yang berdampingan adalah?”
saat membaca soal ini, mungkin kita akan nyoba pake inklusi ekslusi yaitu banyaknya semua kemungkinan – banyaknya kemungkinan 2 angka 1 dempet + banyaknya kemungkinan 3 angka 1 dempet -… tapi, kasus banyak bakal mabok. Trus nyoba kuli aja, kelamaan. Jadi disini solusi yang tepat adalah menggunakan rekursi.
Misal F(n) banyaknya string yang memenuhi syarat tersebut dengan panjang n. Misalkan juga kita punya F(n) dan F(n-1), maka kita bisa mendapat F(n+1) sebagai berikut:
F(n) tidak mungkin memiliki 2 angka 1 yang berdampingan. Maka, jika didepan setiap kemungkinan F(n) dapat ditempeli 0 akan menjadi string dengan panjang n+1 yang pasti memenuhi syarat.
Untuk angka 1, kita tidak bisa nempel sembarangan didepan string F(n). Karena, pasti ada F(n) yang memiliki digit terdepan 1 yang memproduksi string invalid apabila ditempel 1. Tetapi, perhatikan bahwa apabila kita taruh 1 sebagai angka terdepan, selanjutnya haruslah 0, lalu dengan logika sebelumnya kita bisa menempel F(n) dibelakangnya dan tidak akan menyalahi aturan. Namun, karena kita sudah menggunakan 2 tempat (1 0 _ _ …), yang kita tempel adalah F(n-1).
Jadi dapat disimpulkan,
F(n+1) = banyaknya cara menaruh 1 didepan+ banyaknya cara menaruh 0 didepan
F(n+1) = F(n) + F(n-1)
Atau
F(n) = F(n-1) + F(n-2)
Karena memasukkan n=1,2 ke rumus tersebut akan menyebabkan nilai n tidak asli, maka F(1) dan F(2) kita kuli saja :v
F(1) = 2 (0,1). F(2) = 3 (00,01,10). Sisanya bisa dicari dengan rumusnya F(3) = 2 + 3 =5
F(4) = 8 F(5) = 13 F(6) = 21 F(7) = 34 F(8) = 55
Jadi , ada 55 string biner dengan panjang 8 yang tidak memiliki angka 1 yang berdampingan.
cara lagi satu adalah kerja dari atas dengan menulis rumus rekursi lalu substitusi
F(8) = F(7) + F(6)
F(7) = F(6) + F(5)
F(6) = F(5) + F(4)
F(5) = F(4) + F(3)
F(4) = F(3) + F(2)
F(3) = F(2) + F(1) = 5
F(4) = 5 + 3 = 8
…
F(8) = 55
Cara pertama (kerja dari bawah) dikenal dengan cara Bottom Up sedangkan cara kedua (kerja dari atas) dikenal dengan Top down. Untuk dunia orat-oret, cara Bottom up lebih efisien dan hemat nulisnya (menurutku) sedangkan untuk koding lebih enak pake Top down (menurutku juga). Jadi disini aku hanya akan menyelsaikan soal dengan solusi bottom up.
Dapat dilihat dengan menggunakan rekursi, persoalan yang kelihatannya kuli berat dapat diselesaikan dengan cepat dan mudah. Jadi disini aku ingin nyoba menjelaskan teknik rekursi agar bisa lah ngurangin soal-soal yang harus dikuli.
Merumuskan Masalah
“banyaknya string dengan panjang X yang memenuhi suatu aturan Y adalah?”
Kalau soalnya udh kaya gini, gede kemungkinannya ini pake DP. Langkah awalnya coba misalkan F(n) = banyaknya string dengan panjang n yang memenuhi aturan tersebut lalu cari hubungannya dengan nilai-nilai F(n) sebelumnya. Jawabannya adalah F(X).
Contoh: banyaknya string biner dengan panjang n adalah? Solusi rekursinya:
F(n) banyaknya string biner dengan panjang n
- Misal digit terdepan kita isi dengan 1, maka banyaknya cara mengisi digit digit lainnya adalah F(n-1)
- Misal digit terdepan kita isi dengan 0, maka banyaknya cara mengisi digit-digit lainnya adalah F(n-1)
Jadi, F(n) = 2 F(n-1).
Dengan kuli youdontsay didapat F(1) = 2.
Untuk bisa merumuskan masalah, dibutuhkan sedikit latihan. Ntar kalau udh sukses ngerumusin 5 masalah rekursi sendiri, bakal ngerti kok :v. maka dari itu aku berikan 5 soal rekursi dan coba rumusin rekursinya seperti apa.
Soal-Soal:
Mungkin soal soal itu mau dicoba dirumuskan sendiri masalahnya, kalau udah selesai (atau nyerah) berikut ini pembahasannya.
Nomor 1
Nomor 2
Nomor 3
Nomor 4
Nomor 5
Dengan demikian diharapkan kalian udh ngerti caranya konstruksi rumusan rekursi, bagian ngitungnya boleh dicoba sebagai latihan (inget, bawah keatas). Sebelum lanjut, diharapkan udh bener bener ngerti konstruksi DP, coba coba cari soal OSP atau OSK yang kira kira bisa dikerjakan dengan rekursi (soal soal OSP/K terbaru banyak kok) karena bagian selanjutnya akan membuat sangat bingung apabila tidak K
Tidak harus satu parameter
Lihat soal berikut:
“banyaknya string biner dengan panjang 6, dimana tidak mengandung string 101 adalah”. mungkin kepikiran cara seperti mirip dengan nomor 5 tadi
Eh tapi kok yg ABC itu bisa dipakai? dicoba dipikir, diatas udh dibilang kok. berikut penjelasannya(untuk alasan lupa dan kurangnya niat mencari soal asli, beberapa soal di post ini mungkin memiliki deskripsi berbeda dengan soal aslinya)
Pendahuluan
“banyaknya string biner dengan panjang 8 dimana tidak ada 2 angka 1 yang berdampingan adalah?”
saat membaca soal ini, mungkin kita akan nyoba pake inklusi ekslusi yaitu banyaknya semua kemungkinan – banyaknya kemungkinan 2 angka 1 dempet + banyaknya kemungkinan 3 angka 1 dempet -… tapi, kasus banyak bakal mabok. Trus nyoba kuli aja, kelamaan. Jadi disini solusi yang tepat adalah menggunakan rekursi.
Misal F(n) banyaknya string yang memenuhi syarat tersebut dengan panjang n. Misalkan juga kita punya F(n) dan F(n-1), maka kita bisa mendapat F(n+1) sebagai berikut:
F(n) tidak mungkin memiliki 2 angka 1 yang berdampingan. Maka, jika didepan setiap kemungkinan F(n) dapat ditempeli 0 akan menjadi string dengan panjang n+1 yang pasti memenuhi syarat.
Untuk angka 1, kita tidak bisa nempel sembarangan didepan string F(n). Karena, pasti ada F(n) yang memiliki digit terdepan 1 yang memproduksi string invalid apabila ditempel 1. Tetapi, perhatikan bahwa apabila kita taruh 1 sebagai angka terdepan, selanjutnya haruslah 0, lalu dengan logika sebelumnya kita bisa menempel F(n) dibelakangnya dan tidak akan menyalahi aturan. Namun, karena kita sudah menggunakan 2 tempat (1 0 _ _ …), yang kita tempel adalah F(n-1).
Jadi dapat disimpulkan,
F(n+1) = banyaknya cara menaruh 1 didepan+ banyaknya cara menaruh 0 didepan
F(n+1) = F(n) + F(n-1)
Atau
F(n) = F(n-1) + F(n-2)
Karena memasukkan n=1,2 ke rumus tersebut akan menyebabkan nilai n tidak asli, maka F(1) dan F(2) kita kuli saja :v
F(1) = 2 (0,1). F(2) = 3 (00,01,10). Sisanya bisa dicari dengan rumusnya F(3) = 2 + 3 =5
F(4) = 8 F(5) = 13 F(6) = 21 F(7) = 34 F(8) = 55
Jadi , ada 55 string biner dengan panjang 8 yang tidak memiliki angka 1 yang berdampingan.
cara lagi satu adalah kerja dari atas dengan menulis rumus rekursi lalu substitusi
F(8) = F(7) + F(6)
F(7) = F(6) + F(5)
F(6) = F(5) + F(4)
F(5) = F(4) + F(3)
F(4) = F(3) + F(2)
F(3) = F(2) + F(1) = 5
F(4) = 5 + 3 = 8
…
F(8) = 55
Cara pertama (kerja dari bawah) dikenal dengan cara Bottom Up sedangkan cara kedua (kerja dari atas) dikenal dengan Top down. Untuk dunia orat-oret, cara Bottom up lebih efisien dan hemat nulisnya (menurutku) sedangkan untuk koding lebih enak pake Top down (menurutku juga). Jadi disini aku hanya akan menyelsaikan soal dengan solusi bottom up.
Dapat dilihat dengan menggunakan rekursi, persoalan yang kelihatannya kuli berat dapat diselesaikan dengan cepat dan mudah. Jadi disini aku ingin nyoba menjelaskan teknik rekursi agar bisa lah ngurangin soal-soal yang harus dikuli.
Merumuskan Masalah
“banyaknya string dengan panjang X yang memenuhi suatu aturan Y adalah?”
Kalau soalnya udh kaya gini, gede kemungkinannya ini pake DP. Langkah awalnya coba misalkan F(n) = banyaknya string dengan panjang n yang memenuhi aturan tersebut lalu cari hubungannya dengan nilai-nilai F(n) sebelumnya. Jawabannya adalah F(X).
Contoh: banyaknya string biner dengan panjang n adalah? Solusi rekursinya:
F(n) banyaknya string biner dengan panjang n
- Misal digit terdepan kita isi dengan 1, maka banyaknya cara mengisi digit digit lainnya adalah F(n-1)
- Misal digit terdepan kita isi dengan 0, maka banyaknya cara mengisi digit-digit lainnya adalah F(n-1)
Jadi, F(n) = 2 F(n-1).
Dengan kuli youdontsay didapat F(1) = 2.
Untuk bisa merumuskan masalah, dibutuhkan sedikit latihan. Ntar kalau udh sukses ngerumusin 5 masalah rekursi sendiri, bakal ngerti kok :v. maka dari itu aku berikan 5 soal rekursi dan coba rumusin rekursinya seperti apa.
Soal-Soal:
Mungkin soal soal itu mau dicoba dirumuskan sendiri masalahnya, kalau udah selesai (atau nyerah) berikut ini pembahasannya.
Nomor 1
Nomor 2
Nomor 3
Nomor 5
Dengan demikian diharapkan kalian udh ngerti caranya konstruksi rumusan rekursi, bagian ngitungnya boleh dicoba sebagai latihan (inget, bawah keatas). Sebelum lanjut, diharapkan udh bener bener ngerti konstruksi DP, coba coba cari soal OSP atau OSK yang kira kira bisa dikerjakan dengan rekursi (soal soal OSP/K terbaru banyak kok) karena bagian selanjutnya akan membuat sangat bingung apabila tidak K
Tidak harus satu parameter
Lihat soal berikut:
“banyaknya string biner dengan panjang 6, dimana tidak mengandung string 101 adalah”. mungkin kepikiran cara seperti mirip dengan nomor 5 tadi
Rekursi gabisa, balik kuli dong? Tidak!
Memang benar, rumusan rekursi 1 parameter tidak dapat digunakan untuk merumuskan masalah tersebut. Oh, buat yang bingung dengan terminologi, ini contoh parameter:
- F(N) memiliki satu parameter, N. Biasa untuk panjang string atau susunan.
- F(x,y) memiliki dua parameter, x dan y. Biasa menyatakan grid.
Apakah soal-soal yang menanyakan string atau susunan hanya boleh dirumuskan dengan 1 parameter? Tidak!
Kembali ke soal. Misalkan F(x,last): banyaknya string yang memenuhi kriteria tersebut, dengan digit terakhir adalah last. Jawabannya adalah F(6,0) + F(6,1).
Kita rumuskan:
- Menaruh nol didepan: F(x, 0) = F(x-1,0) + F(x-1,1). Ini bisa karena menaruh 0 didepan akan tetap membuat valid semua solusi.
- Menaruh satu didepan: Apabila menaruh 1 didepan, ada 2 kemungkinan: diikuti 1, atau diikuti 0:
1 1 __ . Apabila diikuti 1, kita menambahkan F(x-1,1)
1 0 0 __. Apabila diikuti 0, digit berikutnya haruslah 0. Kita menambahkan F(x-2,0)
Jadi, F(x,1) = F(x-1,1) + F(x-2,0).
Kalau udah 2 dimensi gini, kita ngisinya tabel. Kalau dikuli:
F(1, 0) = 1, F(1,1) = 1, F(2,0) = 2, F(2,1) =2
Ingat, kita kuli biar saat masukin rumus semua nilai x > 0.
Tabel awal:
x\last
|
0
|
1
|
1
|
1
|
1
|
2
|
2
|
2
|
3
| ||
4
| ||
5
| ||
6
|
Catatan: SANGAT DISARANKAN mencoba mengisi tabelnya sendiri dulu, agar mengerti caranya ngisi tabel bottom up
Tabel terisi:
x\last
|
0
|
1
|
1
|
1
|
1
|
2
|
2
|
2
|
3
|
4
|
3
|
4
|
7
|
5
|
5
|
12
|
9
|
6
|
21
|
16
|
Jadi, jawabannya 21 + 16 = 37. Kalau mau ngisi F(x, 0) tinggal jumlahin angka yang ada di baris sebelumnya. Nyari F(x,1) tinggal jumlahin angka angka F(x-1,1) dan F(x-2,0) (yang sudah terisi sebelumnya).
Contoh lain
“Pak Dengklek memiliki 6 buah pot bunga yang disusun berjajar dan siap ditanami 3 (tiga) jenis bunga yaitu melati, mawar, dan anggrek di pekarangan rumahnya. Ada berapa banyak cara pengisian 6 pot bunga tersebut sehingga pada 3 buah pot yang bersebelahan yang manapun, tidak ada 3 jenis bunga yang ketiganya berbeda?” (OSP 2016)
Solusi:
Awalnya mungkin bingung. Tetapi, lama-lama bakal ngerasa ngerumusin dalam dua parameter jauh lebih mudah karena 1 parameter perlu manipulasi dan kreatifitas. Terkadang juga dengan merumuskan dalam dua parameter, rumus 1 parameter dapat ditentukan.
Contohnya:
1. Sebuah grid berukuran 1x10 akan diwarnai dengan pilihan 3 buah warna, dimana petak yang bersebelahan (memiliki sebuah sisi yang sama) tidak boleh berwarna sama. Maka maksimal banyaknya pewarnaan adalah? (PCS 2017)
Solusi
2. kalau banyaknya cara yang diminta itu dalam petak 2x5?
Solusi
3. Suatu hari di negara Rusai, seorang pemiliki toko ingin mendekorasi atapnya dengan dekorasi N garis berwarna warni, dari warna putih, biru dan merah. Terdapat aturan berikut :
- Warna yang bersebelahan tidak boleh sama.
- Warna biru hanya boleh diletakkan diantara warna merah dan putih.
Sebagai contoh untuk N=3, terdapat 4 kemungkinan:
Jika N=8, ada berapa banyak dekorasi yang dapat dibuat? (soal kak Mamat)
Solusi
Jadi kalau 2 parameter, ngisinya pake tabel. Kalau 3 parameter apakah ngisinya di balok?.
Bisa diakali dengan membuat lapisan lapisan baloknya, dengan kata lain misal ada F(a, b, c). Buat C buah tabel ukuran a x b. Tapi, soal yang memerlukan 3 parameter setahuku tidak pernah muncul jadi tidak perlu dibahas secara mendalam. Setidaknya kalau terpaksa pakai 3 parameter, taulah caranya.
Untuk soal latihan, bisa coba kerjain OSP tahun tahun sebelumnya. Kalau sudah ngerti sampai bagian ini, rasanya semua soal tipe ini sudah bisa dijawab :).
Catatan tambahan: kalau sudah masuk ke programming, ada tipe soal yang harus dikerjakan menggunakan teknik ini, namanya soal DP. Kalau disana, sangat jarang sekali parameternya cuman Yang 1 parameter itu biasanya soal super mudah, optimisasi, atau soal super sulit. Jadi, kalau sudah programming ya harus biasa pake 2 parameter :(
Jangan maksa memakai rekursi
Apaan? Tadi menganjurkan rekursi, sekarang kok bilang jangan pake rekursi? Maksudnya apabila kelihatannya pake rekursi juga bakal ngitung berat, mungkin coba cari alternatif lain seperti kombin, greedy, dan sebagainya. Beberapa contoh soal:
1. Pak dengklek ingin menukar uang 98 dolar dengan uang pecahan 1,5,10 dolar. Maka banyaknya pecahan minimum yang diperlukan?
2. sebuah kontraktor ingin membangun jembatan dengan panjang 1802 m. apabila hanya tersedia kayu berukuran 53 m dan 17 m, maka banyaknya cara membuat jembatan tersebut adalah? 53-53-17 dianggap berbeda dengan 17-53-53
3. Terdapat 5 orang petualang dan mereka semua lapar. Di tengah perjalanan mereka memutuskan untuk makan siang di TOKI Fried Kitchen. Berikut adalah menu yang ditawarkan TOKI Fried Kitchen dengan harga dalam ribuan rupiah.
- Nasi 4
- Burger 5
- Paket Lauk 2
- Es Cendol 1
Secara kolektif mereka semua hanya memiliki 30 ribu rupiah untuk makan siang. Jika setiap orang harus memesan makanan dengan criteria berikut: - Memesan nasi dan paket lauk, atau burger - Dapat memesan es cendol, maksimal 1 per orang. Apabila semua uang tidak harus dibelanjakan, maka banyaknya cara mereka makan adalah? (OSK 2015)
Nomor 1
Nomor 2
Nomor 3
Menurutku, rekursi baik dipakai kalau buat tabelnya sedikit. Sedikit itu berbeda-beda untuk setiap orang. Kalau memang intended soalnya diselesaikan pake rekursi, pasti bakal dikasi nilai yang lumayan kecil (seperti n<=15). Kalau batasan gede, berarti harus cari cara lain atau soalnya time waster -_-.
Masih ada beberapa teknik rekursi yang tidak dikover disini karena kelangkaannya. Tapi, diharapkan dengan menguasai teknik teknik diatas cukup untuk menyelesaikan sebagian besar soal-soal. Zaman now, soal rekursi modern kadang disembunyiin agar susah disadari bahwa ini adalah soal rekursi. Dengan seringnya latihan soal rekursi, semakin baik!
aku mohon maaf apabila ada penjelasan yang kurang jelas, atau kesalahan kata,kurang rapi atau kalau pembahasannya ada yang salah dan semoga ini bermanfaat :) .
Penjelasannya coeg sekali :v tapi lengkap dan jelas.
ReplyDeleteIf may have} a smartphone or tablet, find a way to|you probably can} take pleasure in free video poker on the move. The 1xbet korea step-by-step guide above applies just the identical as on mobile. You can explore our high video poker video games free on mobile here. It's easy to start out|to begin} training video poker for on mobile, with the gameplay being precisely the identical when you begin half in} for actual money.
ReplyDelete