परिचय
मान लीजिए कि आप और आपका दोस्त एक गेम खेल रहे हैं। आपका मित्र n
बिट्स के कुछ विशेष अनुक्रम के बारे में सोचता है , और आपका कार्य उन्हें प्रश्न पूछकर अनुक्रम को कम करना है। हालाँकि, आपके द्वारा पूछे जाने वाले एकमात्र प्रकार के प्रश्न "आपके अनुक्रम की सबसे लंबी सामान्य अनुवर्तीता कितनी लंबी है और S
", S
बिट्स का कोई अनुक्रम कहाँ है। आपको जितने कम प्रश्नों की आवश्यकता होगी, उतना ही बेहतर होगा।
काम
आपका कार्य एक प्रोग्राम या फ़ंक्शन लिखना है जो इनपुट को एक सकारात्मक पूर्णांक n
, और R
लंबाई के एक द्विआधारी अनुक्रम के रूप में लेता है n
। अनुक्रम पूर्णांक, एक स्ट्रिंग, या अपनी पसंद के कुछ अन्य उचित प्रकार का एक सरणी हो सकता है। आपका कार्यक्रम अनुक्रम का उत्पादन करेगा R
।
आपके कार्यक्रम को सीधे अनुक्रम तक पहुंचने की अनुमति नहीं हैR
। केवल बात यह है कि यह करने के लिए करने की अनुमति दी है R
फ़ंक्शन का इनपुट के रूप में यह दे रहा है len_lcs
एक और बाइनरी अनुक्रम के साथ S
। समारोह len_lcs(R, S)
की सबसे लंबी आम subsequence की लंबाई देता है R
और S
। इसका अर्थ है बिट्स का सबसे लंबा क्रम जो दोनों ( R
और जरूरी नहीं कि सन्निहित) के रूप में होता है S
। len_lcs
जिनके इनपुट अलग-अलग लंबाई के हो सकते हैं। कार्यक्रम को इस फ़ंक्शन को R
कुछ समय पर और अन्य अनुक्रमों पर कॉल करना चाहिए , और फिर R
उस जानकारी के आधार पर अनुक्रम का पुनर्निर्माण करना चाहिए ।
उदाहरण
इनपुट पर विचार करें n = 4
और R = "1010"
। सबसे पहले, हम मूल्यांकन कर सकते हैं len_lcs(R, "110")
, जो देता है 3
, क्योंकि "110"
सबसे लंबे समय तक सामान्य है "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
75 और 124 के बीच लंबाई के 100 यादृच्छिक द्विआधारी दृश्यों वे, 0 और 1 के बीच तीन यादृच्छिक तैरता लेने के रूप में उनकी औसत निकालकर उत्पन्न किया गया युक्त a
, और फिर flipping एक a
-biased सिक्का n
बार। आप इन अनुक्रमों पर कॉलlen_lcs
की औसत संख्या है , कम स्कोर बेहतर है। आपके सबमिशन में कॉल की संख्या दर्ज होनी चाहिए। कोई समय सीमा नहीं है, सिवाय इसके कि आपको अपना कार्यक्रम फ़ाइल पर भेजने से पहले चलाना चाहिए।
आपका सबमिशन निर्धारक होगा। PRNGs की अनुमति है, लेकिन उन्हें 200116
यादृच्छिक बीज के रूप में आज की तारीख, (या निकटतम समकक्ष) का उपयोग करना चाहिए । आपको इन विशेष परीक्षण मामलों के खिलाफ अपनी अधीनता को अनुकूलित करने की अनुमति नहीं है। यदि मुझे संदेह है कि यह हो रहा है, तो मैं एक नया बैच उत्पन्न करूंगा।
यह कोड गोल्फ नहीं है, इसलिए आपको पठनीय कोड लिखने के लिए प्रोत्साहित किया जाता है। रोसेटा कोड में सबसे लंबे समय तक सामान्य पृष्ठ पर एक पृष्ठ है ; आप len_lcs
अपनी पसंद की भाषा में लागू करने के लिए इसका उपयोग कर सकते हैं ।
lcs
इसके बजाय कहां पहुंच सकते हैं len_lcs
।
lcs(R, "01"*2*n)
रिटर्न के बाद से बहुत दिलचस्प नहीं होगा R
। ;) लेकिन वह काम कर सकता है अगर कॉलिंग 1 के बजाय lcs(R, S)
स्कोर बढ़ाएगी len(S)
, या ऐसा ही कुछ ...