परिचय
मान लीजिए कि आप और आपका दोस्त एक गेम खेल रहे हैं। आपका मित्र 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.txt75 और 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), या ऐसा ही कुछ ...