Suhendry’s Blog

When in doubt, do math ;-)

Indonesia National Contest 2008: Final Round

with one comment

Problem B. Panda Land 5: Panda Programming Language

Deskripsi Soal B
Problem Author: Evan Leonardi

Problem favorit gw di INC 2008!! B-) Sampai sekarang gw masih tertarik untuk mencari solusi polynomialnya.

Diberikan beberapa fungsi beserta graph dependensinya pada sebuah program, anda diminta untuk mengatur susunan fungsi tersebut dengan cost seminimum mungkin sehingga program tersebut dapat dikompile. Sekilas soal ini terlihat sangat susah (meskipun memang termasuk susah di antara soal yang lain), karena kombinasi dan urutan pemindahan yang bisa dilakukan cukup banyak. Batasan nilai N sebesar 18 membuat soal ini tidak bisa diselesaikan secara bruteforce O(N!) dan memaksa kita mencari solusi yang lebih efisien.

Berikut ini adalah ilustrasi untuk sample input #2:
b1.gifb2.gifb3.gif

Pemindahan A ke bawah D secara langsung pada gambar di atas dapat diuraikan menjadi beberapa pemindahan bertahap (meloncati satu fungsi saja), yaitu: pindahkan A ke bawah B, dilanjutkan ke bawah C, dan setelah itu ke bawah D. Total cost yang digunakan adalah: (A * B) + (A * C) + (A * D) = A * (B + C + D).

Jika diperhatikan, pemindahan dengan meloncati satu fungsi saja itu sama dengan menukar posisi kedua fungsi tersebut (memindahkan A ke bawah B adalah sama dengan memindahkan B ke atas A). Jadi tidak masalah apakah kita ingin memindahkan sebuah fungsi ke bawah atau ke atas, karena pasti ada langkah equivalent untuk arah yang sebaliknya. Sehingga, untuk menyelesaikan soal ini kita bisa memfokuskan pada pemindahan ke satu arah saja (ke bawah atau ke atas).

Pada contoh di atas, langkah equivalent untuk pemindahan A ke bawah D adalah: pindahkan B ke atas A (B * A), kemudian pindahkan C ke atas di antara A dan B (C * A), dan terakhir pindahkan D ke atas di antara A dan C (D * A).

b4.gifb5.gifb6.gif

Berikutnya, kita selesaikan problem ini dengan mencoba semua kombinasi pemindahan fungsi (di penjelasan ini kita akan menggunakan pemindahan ke atas). Mulai dari state awal (semua fungsi belum dipindahkan), pilih salah satu fungsi yang belum dipindahkan (coba semua) dan pindahkan fungsi tersebut ke atas di bawah fungsi-fungsi yang sudah dipindahkan sebelumnya. Dengan cara ini, semua kombinasi urutan pemindahan bisa kita coba.

Contoh pemindahan fungsi dan cost-nya:
b9.gifb10.gif

Ilustrasi perpindahan minimum pada sample input #2:
b11.gif
b12.gif
b13.gif
b14.gif
b15.gif

Pencarian cost minimum dengan mencoba semua kombinasi seperti ini bisa dinyatakan dengan state:

b8.gif
S = set fungsi yang belum dipindahkan.
i = fungsi i, member dari set S.
f(S) = cost minimum untuk mengatur ulang posisi fungsi pada state S.
cost(i, S) = cost untuk memindahkan fungsi i pada state S.
fungsi i boleh dipindahkan (valid) hanya jika semua fungsi yang dipanggilnya sudah dipindahkan terlebih dahulu (tidak ada dalam S).

State di atas bisa diselesaikan dengan dynamic programming. Gunakan bit masking untuk mengimplementasikan set S pada program (0:tidak ada dalam set; 1:ada dalam set). Semua nilai dari cost(i, S) bisa digenerate dalam O(N . 2N), sehingga setiap pemanggilannya hanya O(1). note: 2N adalah ukuran untuk semua kombinasi set S. Dengan demikian, total kompleksitas yang diperlukan untuk f(S) adalah O(N . 2N).

Solusi C/C++
oleh Suhendry Effendy show

Solusi JAVA
oleh Suhendry Effendy show

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Written by suhendry

June 28th, 2008 at 1:56 pm

Posted in Event

One Response to 'Indonesia National Contest 2008: Final Round'

Subscribe to comments with RSS or TrackBack to 'Indonesia National Contest 2008: Final Round'.

Leave a Reply