pengantar
Misalkan Anda dan teman Anda sedang bermain game. Teman Anda memikirkan beberapa urutan nbit, dan tugas Anda adalah menyimpulkan urutan dengan mengajukan pertanyaan kepada mereka. Namun, satu-satunya jenis pertanyaan yang Anda boleh tanyakan adalah "Berapa lama urutan umum terpanjang dari urutan Anda dan S", di mana Sada urutan bit. Semakin sedikit pertanyaan yang Anda butuhkan, semakin baik.
Tugas
Tugas Anda adalah menulis sebuah program atau fungsi yang mengambil input bilangan bulat positif n, dan deretan Rpanjang biner n. Urutannya bisa berupa array bilangan bulat, string, atau jenis pilihan masuk akal lainnya. Program Anda akan menampilkan urutan R.
Program Anda tidak diizinkan untuk mengakses urutan Rsecara langsung. Satu- satunya hal yang diperbolehkan untuk dilakukan Radalah memberikannya sebagai input ke fungsi len_lcsbersama dengan urutan biner lainnya S. Fungsi len_lcs(R, S)mengembalikan panjang urutan umum terpanjang dari Rdan S. Ini berarti urutan bit terpanjang yang terjadi sebagai (tidak harus bersebelahan) berikutnya dalam keduanya Rdan S. Input len_lcsyang panjangnya mungkin berbeda. Program harus memanggil fungsi ini Rdan urutan lainnya beberapa kali, dan kemudian merekonstruksi urutan Rberdasarkan informasi itu.
Contoh
Pertimbangkan input n = 4dan R = "1010". Pertama, kita dapat mengevaluasi len_lcs(R, "110"), yang memberi 3, karena "110"merupakan urutan umum terpanjang dari "1010"dan "110". Kemudian kita tahu bahwa Rdiperoleh dari "110"dengan memasukkan satu bit pada posisi tertentu. Selanjutnya, kita mungkin mencoba len_lcs(R, "0110"), yang kembali 3karena urutan umum terpanjang adalah "110"dan "010", jadi "0110"tidak benar. Lalu kami coba len_lcs(R, "1010"), yang kembali 4. Sekarang kita tahu itu R == "1010", jadi kita bisa mengembalikan urutan itu sebagai output yang benar. Ini membutuhkan 3 panggilan ke len_lcs.
Aturan dan penilaian
Dalam repositori ini , Anda akan menemukan file bernama subsequence_data.txtberisi 100 urutan biner acak dengan panjang antara 75 dan 124. File-file tersebut dihasilkan dengan mengambil tiga float acak antara 0 dan 1, mengambil rata-rata mereka a, dan kemudian membalik-balik akoin nkali lipat. Skor Anda adalah jumlah ratalen_lcs - rata panggilan ke urutan ini, skor yang lebih rendah menjadi lebih baik. Kiriman Anda harus mencatat jumlah panggilan. Tidak ada batasan waktu, kecuali bahwa Anda harus menjalankan program Anda pada file sebelum mengirimkannya.
Kiriman Anda harus bersifat deterministik. PRNG diizinkan, tetapi mereka harus menggunakan tanggal hari ini, 200116(atau setara terdekat), sebagai benih acak. Anda tidak diizinkan untuk mengoptimalkan kiriman Anda terhadap kasus-kasus tes tertentu. Jika saya curiga ini terjadi, saya akan membuat batch baru.
Ini bukan kode golf, jadi Anda dianjurkan untuk menulis kode yang dapat dibaca. Rosetta Code memiliki halaman tentang urutan umum terpanjang ; Anda dapat menggunakannya untuk mengimplementasikan len_lcsdalam bahasa pilihan Anda.
lcsbukannya len_lcs.
lcs(R, "01"*2*n)kembali R. ;) Tapi itu bisa berhasil jika menelepon lcs(R, S)akan meningkatkan skor dengan len(S)alih-alih 1, atau sesuatu seperti itu ...