Module: डायनेमिक प्रोग्रामिंग में पैटर्न - 2


Problem

4 /5


बौना आदमी

Theory Click to read/hide

अस्वीकरण: नीचे वर्णित विधि सार्वभौमिक नहीं है, लेकिन यह अक्सर समस्या का समाधान कर सकती है या आपको सही समाधान तक पहुंचने में मदद कर सकती है।

यदि आपको किसी समस्या में क्रमचय के अस्तित्व की जांच करने की आवश्यकता है, या मेल खाने वाले क्रमपरिवर्तन की संख्या, या कुछ समान खोजने की आवश्यकता है, तो आपको गतिशील सबसेट प्रोग्रामिंग का उपयोग करने पर विचार करना चाहिए।

मुख्य पैरामीटर एक बिटमास्क होगा, जो दिखाएगा कि कौन से तत्व पहले से क्रमचय में शामिल किए गए हैं और कौन से नहीं हैं। इसके अलावा अक्सर एक दूसरे पैरामीटर की आवश्यकता होती है जो इंगित करता है कि कौन सा तत्व सबसे अंत में शामिल किया गया था।

ग्राफ़ में पथ के संदर्भ में अक्सर क्रमपरिवर्तन देखे जा सकते हैं। तदनुसार, आइए एक उत्कृष्ट उदाहरण पर विचार करें - हैमिल्टनियन पथ समस्या।
एक हैमिल्टनियन पथ एक सरल पथ है जो ग्राफ के प्रत्येक शीर्ष से ठीक एक बार गुजरता है। इसे केवल लंबाई n के क्रमचय के रूप में दर्शाया जा सकता है, जहाँ n शीर्षों की संख्या है। इस क्रमचय के भीतर का क्रम उस क्रम को इंगित करेगा जिसमें इस पथ में शीर्षों को पार किया जाता है।

ग्राफ़ में हैमिल्टनियन पथ की उपस्थिति की जाँच करने के लिए, आइए डायनामिक्स dp[mask][last] शुरू करें - क्या कोई सरल पथ है जो मास्क बिटमास्क में चिन्हित शीर्षों को बायपास करता है और अंतिम शीर्ष पर समाप्त होता है।
प्रारंभिक मान होंगे dp[2i][i] = सत्य, बाकी असत्य, जिसका अर्थ है कि किसी भी कोने से शुरू होने वाला हमेशा एक खाली रास्ता होता है।
डीपी [मुखौटा] [अंतिम] में मूल्य सही होने से हम "पथ का विस्तार" के अर्थ में बदलाव को आगे बढ़ाएंगे। यही है, हम उन शीर्षों की संख्या की तलाश करेंगे जो मुखौटा में शून्य के साथ चिह्नित हैं (हमने अभी तक उन्हें रास्ते में नहीं देखा है) और एक ही समय में ऐसा है कि अंतिम से इस शीर्ष तक एक किनारा है (पथ होना चाहिए) मौजूदा किनारे से बढ़ाया जा सकता है)। यानी हम dp[mask | 2k][k] = true अगर dp[mask][last] = true AND mask & 2k = 0 (शीर्ष k अभी तक नहीं देखा गया है) और अंत में एक किनारा है -> क.
अंततः, एक हैमिल्टनियन पथ मौजूद है यदि dp में सभी बिटमास्क और किसी भी अंतिम शीर्ष के मापदंडों के लिए एक सही मान है।

Problem

एक बार बौना क्वार्क एक खजाने के नक्शे पर आ गया। मानचित्र पर एन बिंदु चिह्नित हैं जहां खजाना पाया जा सकता है। सभी बिंदुओं को 1 से N तक क्रमांकित किया गया है। बिंदुओं की प्रत्येक जोड़ी के लिए, क्वार्क उन्हें जोड़ने वाली सड़क की लंबाई जानता है। क्वार्क बिंदु संख्या 1 से अपनी खोज शुरू करता है। अपनी लंबी यात्रा शुरू करने से पहले, चालाक बौना उन बिंदुओं को पार कर जाता है, जहां उसकी राय में कोई खजाना नहीं हो सकता। यह गारंटी है कि बिंदु संख्या 1 को कभी भी पार नहीं किया जाता है। उसके बाद, क्वार्क कुछ मार्ग चुनता है जो मानचित्र पर शेष सभी बिंदुओं से होकर गुजरता है। मार्ग एक ही बिंदु से एक से अधिक बार नहीं गुजरता है। एक क्वार्क केवल उन सड़कों पर चल सकता है जो बिना क्रॉस वाले बिंदुओं को जोड़ती हैं।

क्वार्क न्यूनतम लंबाई का मार्ग चुनना चाहता है। क्वार्क के लिए ऐसा मार्ग खोजना आवश्यक है।

इनपुट
पहली पंक्ति में एक पूर्णांक N (1 ≤ N ≤ 15) — मानचित्र पर चिह्नित बिंदुओं की संख्या। अगली N पंक्तियों में बिंदुओं के बीच की दूरी होती है। (i+1)-वीं पंक्ति में N पूर्णांक di1,di2, diN — i-वें बिंदु से अन्य सभी तक सड़कों की लंबाई। यह गारंटी है कि dij=dji, dii=0 और 0 <dij < 100। (N+2)वीं पंक्ति में एक पूर्णांक Q (1 < Q ≤ 1000) — इस मानचित्र के बिंदुओं को हटाने के विकल्पों की संख्या। निम्नलिखित Q पंक्तियों में विलोपन के विकल्पों का वर्णन है। विवरण संख्या C (0 ≤ C < N) — अंकों की संख्या जहां, क्वार्क के अनुसार, खजाना नहीं हो सकता। अगली सी संख्या इन बिंदुओं की संख्या देती है।

छाप
क्यू लाइन प्रिंट करें। प्रत्येक पंक्ति में एक पूर्णांक प्रिंट करें — बिंदुओं को हटाने के संगत विकल्प के साथ न्यूनतम मार्ग की लंबाई।
उदाहरण
<टेबल क्लास = "टेबल-एसएम टेबल-बॉर्डर टेबल-स्ट्राइप्ड टेबल-लिस्ट-टेस्ट"> <सिर> <थ वर्ग = "अंक"> # <वें>इनपुट <वें>आउटपुट <शरीर> 1 3
0  45 10
45 0  30
10 30 0
2
0
1 3 40
45 2 5
0  14 20 17 14
14 0  15 19 18
20 15 0  15 16
17 19 15 0  14
14 18 16 14 0
2
3 5 4 3
0 14
58