Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

पायथन में ऊपरी-बाएं से नीचे-दाएं सेल तक सिक्के चुनकर वापस आने का प्रोग्राम


मान लीजिए हमारे पास एक 2D मैट्रिक्स है जिसमें 3 संभावित मान हैं:

  • 0 खाली सेल के लिए।

  • 1 सिक्के के लिए।

  • -1 दीवार के लिए।

हमें ऊपरी-बाएं सेल से शुरू करके नीचे-दाएं सेल तक केवल दाएं या नीचे की दिशा में जाकर अधिकतम सिक्कों की संख्या ज्ञात करनी है। फिर केवल ऊपर या बाएं दिशा में चलकर ऊपरी-बाएं सेल पर वापस आना है। जब हम एक सिक्का उठाते हैं, तो सेल का मान 0 हो जाता है। यदि हम नीचे-दाएं सेल तक नहीं पहुंच सकते, तो 0 लौटाएं।

इसलिए, यदि इनपुट इस प्रकार है:

011
111
-111
011

तो आउटपुट 8 होगा।

हल करने के चरण

  • n := mat की पंक्तियों की संख्या, m := mat के स्तंभों की संख्या

  • util() फ़ंक्शन परिभाषित करें। यह i, j, k, l लेगा

    • यदि i और j, mat की रेंज में नहीं हैं या mat[i, j], -1 के समान है, तो -infinity लौटाएं

    • यदि k और l, mat की रेंज में नहीं हैं या mat[k, l], -1 के समान है, तो -infinity लौटाएं

    • यदि i, j, k और l सभी 0 हैं, तो mat[0, 0] लौटाएं

    • best := -infinity

    • प्रत्येक जोड़ी (dx1, dy1) के लिए [(-1, 0), (0, -1)] में, करें

      • प्रत्येक जोड़ी (dx2, dy2) के लिए [(-1, 0), (0, -1)] में, करें

        • best := best और util(i + dy1, j + dx1, k + dy2, l + dx2) का अधिकतम

    • mat[i, j] + (1 जब i, k के समान नहीं है अन्यथा 0) * mat[k, l] + best लौटाएं

  • मुख्य विधि से निम्नलिखित करें:

    • 0 और util(n - 1, m - 1, n - 1, m - 1) का अधिकतम लौटाएं

उदाहरण

class Solution:
    def solve(self, mat):
        n, m = len(mat), len(mat[0])
        def util(i, j, k, l):
            if not (0 <= i < n and 0 <= j < m) or mat[i][j] == -1:
                return -1e9
            if not (0 <= k < n and 0 <= l < m) or mat[k][l] == -1:
                return -1e9
            if i == 0 and j == 0 and k == 0 and l == 0:
                return mat[0][0]
            best = -1e9
            for dx1, dy1 in [(-1, 0), (0, -1)]:
                for dx2, dy2 in [(-1, 0), (0, -1)]:
                    best = max(best, util(i + dy1, j + dx1, k + dy2, l + dx2))
            return mat[i][j] + (i != k) * mat[k][l] + best
        return max(0, util(n - 1, m - 1, n - 1, m - 1))

ob = Solution()
matrix = [
    [0, 1, 1],
    [1, 1, 1],
    [1, -1, 1],
    [0, 1, 1]
]
print(ob.solve(matrix))

इनपुट

[[0, 1, 1], [1, 1, 1], [1, -1, 1], [0, 1, 1]]

आउटपुट

8
  1. - पायथन में परिवर्तन करने के लिए आवश्यक सिक्कों की संख्या खोजने का प्रोग्राम

    मान लीजिए हमारे पास विभिन्न मूल्यवर्ग के सिक्के (1,5,10,25) हैं और पैसे की कुल राशि amount है। हमें एक फ़ंक्शन परिभाषित करना है जो उस राशि को बनाने के लिए आवश्यक सबसे कम सिक्कों की संख्या की गणना करे। इसलिए यदि इनपुट 64 है, तो आउटपुट 7 है। यह 25 + 25 + 10 + 1 + 1 + 1 + 1 = 64 का उपयोग करके बनता है।इ

  1. - पायथन में अधिकतम सिक्के एकत्र करने का प्रोग्राम

    मान लीजिए हमारे पास एक 2D मैट्रिक्स है जहां प्रत्येक सेल कुछ सिक्के संग्रहीत करता है। यदि हम [0,0] से शुरू करते हैं, और केवल दाएं या नीचे जा सकते हैं, तो हमें नीचे-दाएं कोने तक पहुंचने तक एकत्र किए जा सकने वाले अधिकतम सिक्कों की संख्या ढूंढनी है। उदाहरण के लिए, यदि इनपुट है: 1422 6005 तो आउटपुट

  1. - पायथन में उन स्ट्रिंग्स की संख्या खोजें जहां 'a' 'a' या 'b' हो सकता है, और 'b' 'b' ही रहता है

    मान लीजिए हमारे पास केवल a और b वाली एक स्ट्रिंग s है। a a रह सकते हैं या b में बदल सकते हैं, लेकिन b को बदला नहीं जा सकता। हमें उन अद्वितीय स्ट्रिंग्स की संख्या ढूंढनी है जो हम बना सकते हैं। उदाहरण के लिए, यदि इनपुट है s = baab, तो आउटपुट होगा 4, क्योंकि हम ये स्ट्रिंग्स बना सकते हैं: [baab, babb,