บทนำ
สมมติว่าคุณและเพื่อนกำลังเล่นเกม เพื่อนของคุณคิดถึงลำดับของnบิตบางอย่างและงานของคุณคือการอนุมานลำดับโดยถามคำถาม อย่างไรก็ตามคำถามประเภทเดียวที่คุณได้รับอนุญาตให้ถามคือ "นานแค่ไหนที่การเรียงลำดับทั่วไปที่ยาวที่สุดของลำดับของคุณและS" ซึ่งSเป็นลำดับของบิตใด ๆ คำถามที่คุณต้องการน้อยลงเท่านั้น
งาน
งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เป็น input เป็นจำนวนเต็มบวกnและลำดับไบนารีของความยาวR nลำดับอาจเป็นอาร์เรย์ของจำนวนเต็มสตริงหรือประเภทอื่น ๆ ที่คุณต้องการ Rโปรแกรมของคุณจะส่งออกลำดับ
โปรแกรมของคุณไม่ได้รับอนุญาตให้เข้าถึงลำดับRโดยตรง เพียงสิ่งที่จะได้รับอนุญาตให้ทำอย่างไรเพื่อRที่จะให้มันเป็น input เพื่อฟังก์ชั่นพร้อมกับลำดับไบนารีอื่นlen_lcs Sฟังก์ชั่นlen_lcs(R, S)ส่งกลับความยาวของ subsequence ทั่วไปที่ยาวที่สุดของและR Sซึ่งหมายความว่าลำดับที่ยาวที่สุดของบิตซึ่งเกิดขึ้นเป็น (ไม่จำเป็นต้องต่อเนื่องกัน) subsequence ทั้งในและR Sอินพุตlen_lcsที่อาจมีความยาวแตกต่างกัน โปรแกรมควรเรียกใช้ฟังก์ชันนี้Rและลำดับอื่น ๆ ตามจำนวนครั้งแล้วสร้างลำดับใหม่Rตามข้อมูลนั้น
ตัวอย่าง
พิจารณาปัจจัยการผลิตและn = 4 R = "1010"อันดับแรกเราอาจประเมินlen_lcs(R, "110")ซึ่งจะช่วยให้3เนื่องจาก"110"เป็น subsequence ทั่วไปที่ยาวที่สุดของและ"1010" "110"จากนั้นเราก็รู้ว่าRได้มาจากการ"110"แทรกตำแหน่งหนึ่งบิตในบางตำแหน่ง ต่อไปเราอาจลองlen_lcs(R, "0110")ซึ่งผลตอบแทน3ตั้งแต่ลำดับที่ยาวที่สุดร่วมกัน"110"และ"010"ดังนั้นจึง"0110"ไม่ถูกต้อง จากนั้นเราก็พยายามซึ่งผลตอบแทนlen_lcs(R, "1010") 4ตอนนี้เรารู้R == "1010"แล้วดังนั้นเราสามารถกลับลำดับนั้นเป็นเอาต์พุตที่ถูกต้อง ต้องมีการโทรถึง 3 len_lcsครั้ง
กฎและการให้คะแนน
ในแหล่งเก็บข้อมูลนี้คุณจะพบไฟล์ที่เรียกว่าsubsequence_data.txtมี 100 สุ่มลำดับไบนารีของความยาวระหว่าง 75 และ 124 พวกเขาถูกสร้างขึ้นโดยการสามลอยสุ่มระหว่าง 0 และ 1 ค่าเฉลี่ยของพวกเขาเป็นaแล้วพลิกaเหรียญ -biased nครั้ง คะแนนของคุณคือจำนวนการโทรโดยเฉลี่ยlen_lcsลำดับเหล่านี้คะแนนที่ต่ำกว่าจะดีกว่า การส่งของคุณควรบันทึกจำนวนการโทร ไม่มีการ จำกัด เวลายกเว้นว่าคุณควรเรียกใช้โปรแกรมของคุณในไฟล์ก่อนที่จะส่ง
การส่งของคุณจะถูกกำหนดไว้ อนุญาตให้ใช้ PRNG ได้ แต่ต้องใช้วันที่วันนี้200116(หรือเทียบเท่าที่ใกล้เคียงที่สุด) เป็นเมล็ดสุ่ม คุณไม่ได้รับอนุญาตให้ปรับการส่งของคุณให้เหมาะสมกับกรณีทดสอบเหล่านี้ หากฉันสงสัยว่าสิ่งนี้กำลังเกิดขึ้นฉันจะสร้างแบทช์ใหม่
นี่ไม่ใช่รหัสกอล์ฟดังนั้นคุณควรเขียนรหัสที่อ่านได้ Rosetta รหัสมีหน้าบน subsequence ทั่วไปที่ยาวที่สุด ; คุณอาจใช้สิ่งนั้นเพื่อนำไปใช้len_lcsในภาษาที่คุณเลือก
lcs len_lcs
lcs(R, "01"*2*n) R;) แต่ที่สามารถทำงานได้ถ้าโทรlcs(R, S)จะเพิ่มคะแนนโดยการlen(S)แทน 1, หรือสิ่งที่ต้องการ ...