Project Euler #82 (Python) -
सबसे पहले यह समस्या है:। यह मेरा कोड है:
# https://projecteuler.net/problem=82 मैट्रिस = ओपन ('मैट्रिक्स 3 डैस्ट', 'आर')। पढ़ें ()। विभाजन (' N ') एम = [] मैट्रिस में एल के लिए: if el ==' ': जारी रखें tmp = el.split (', ') m.append (tmp) मैट्रिक्स = [[i श्रेणी के लिए (80)] के लिए जम्मू में रेंज (80)] एक्स, वाई = 0,0 जबकि (ट्रू): मैट्रिक्स [x] [y] = int (m [x] [y]) y + = 1 यदि y == 80: y = 0 x + = 1 यदि x == 80: तोड़ें tmp = [0] * 80 x, y = 0,78 जबकि (ट्रू): यदि x == 0: tmp [x] = min (मैट्रिक्स [x] [y + 1] , मैट्रिक्स [x + 1] [y] + मैट्रिक्स [x + 1] [y + 1]) यदि x == 79: टीएमपी [x] = मिनट (मैट्रिक्स [x] [y + 1], मैट्रिक्स [x- 1] [या] + मैट्रिक्स [x-1] [y + 1]) अन्य: टीएमपी [x] = मिनट (मैट्रिक्स [x] [y + 1], मैट्रिक्स [x-1] [y] + मैट्रिक्स [x -1] [y + 1], मैट्रिक्स [x + 1] [y] + मैट्रिक्स [x + 1] [y + 1]) x + = 1 यदि x == 80: श्रेणी के लिए ई (80): मैट्रिक्स [ ई] [या] + = टीएमपी [ई] टीएमपी = [0] * 80 x = 0 y + = - 1 अगर वाई एंड एलटी; 0: ब्रेक मिनिमो = 10 ** 9 ई रेंज (80) में: यदि मैट्रिक्स [ई] [0] & lt; minimo: minimo = matrix [e] [0] प्रिंट (minimo) इस कोड के पीछे का विचार निम्न है: मैं 79 वीं कॉलम से शुरू (78 वें यदि आप 0 से गिनती शुरू करें) और मैं किसी भी एन से प्राप्त करने के लिए सर्वोत्तम (न्यूनतम) तरीके की गणना करता हूं उस कॉलम में दाईं ओर कॉलम में प्रयास करें जब स्तंभ खत्म हो जाता है, तब मैं इसे कम से कम परिणामों के साथ बदलता हूं और मैं स्तंभ के साथ बाईं तरफ से ऐसा करना शुरू कर देता हूं।
क्या कोई मुझे समझने में मदद करता है कि मुझे गलत जवाब क्यों मिलता है? (I
उदाहरण के लिए मैट्रिक्स के लिए एक ही कोड काम करता है (यह काम करता है यदि आप कोर्स की अभद्रता बदलते हैं) पाठ "itemprop =" text ">
अगर मैं सवाल, अपना कोड और आपके एल्गोरिदम को सही तरीके से समझता हूं, ऐसा लगता है कि आप वास्तव में एक कॉलम से दूसरे तक पहुंचने का सबसे अच्छा तरीका नहीं देख रहे हैं क्योंकि आप केवल अगले कॉलम में आने के कुछ संभावित तरीकों पर विचार उदाहरण के लिए, पहले पुनरावृत्ति पर विचार करें (जब y = 78 )। फिर मुझे लगता है कि आप जो चाहते हैं वह टीएमपी [0] को 79 वीं कॉलम में कहीं भी मैट्रिक्स [0] [78] से प्राप्त करने के लिए न्यूनतम राशि रखने के लिए, लेकिन आप केवल दो संभावनाओं पर विचार करें: सही हो जाएं, या नीचे जाएं और फिर सही जाएं अगर अगले कॉलम में मैट्रिक्स [0] [78] से प्राप्त करने का सबसे अच्छा तरीका है तो नीचे 6 प्रविष्टियां डालें और फिर सही हो जाएं? आपका कोड इस संभावना पर कभी विचार नहीं करेगा। आपका कोड शायद छोटे उदाहरण पर काम करता है क्योंकि ऐसा इसलिए होता है कि न्यूनतम पथ केवल प्रत्येक कॉलम में एक बार ऊपर या नीचे जाता है लेकिन मुझे लगता है कि यह एक संयोग है (संभवत: एक खराब चुना हुआ उदाहरण)।
इस समस्या को हल करने का एक तरीका निम्नलिखित दृष्टिकोण का उपयोग कर रहा है जब इनपुट एक एनएक्सएन मैट्रिक्स होता है, तो एक NxN सरणी min_path को परिभाषित करें। हम min_path को भरना चाहते हैं जिससे कि min_path [x] [y] इनपुट मैट्रिक्स के पहले कॉलम में किसी भी प्रविष्टि में न्यूनतम पथ राशि है और [x] [y] पर समाप्त हो रहा है । हम एक समय में min_path के एक स्तंभ को भरते हैं, जो बाएं स्तंभ पर शुरू होता है। min_path [i] [j] की गणना करने के लिए, हम min_path के (j-1) वें स्तंभ में सभी प्रविष्टियों को देखते हैं, और उनमें से प्रत्येक से मिलने की लागत प्रविष्टियों को (i, j)। यहां यह समाधान दिखाए गए कुछ पायथन कोड हैं: यह एक ओ (एन ^ 4) समाधान है लेकिन संभवतः इसे तेजी से बनाया जा सकता है! (शायद sum_to कॉल के परिणाम precomputing द्वारा?)
Comments
Post a Comment