मान लीजिए कि हमारे पास सकारात्मक पूर्णांकों की एक सरणी है, सभी बाइनरी पेड़ों पर विचार करें जैसे कि -
- प्रत्येक नोड में 0 या 2 बच्चे होते हैं;
- गिरफ्तारी सरणी के मान पेड़ के इन-ऑर्डर ट्रैवर्सल में प्रत्येक पत्ते के मूल्यों के अनुरूप होते हैं।
- प्रत्येक गैर-पत्ती नोड का मान क्रमशः इसके बाएँ और दाएँ उपप्रकार में सबसे बड़े पत्ती मान के गुणनफल के बराबर होता है।
सभी संभावित द्विआधारी पेड़ों में से, हमें प्रत्येक गैर-पत्ती नोड के मूल्यों का सबसे छोटा संभव योग खोजना होगा। इसलिए यदि इनपुट गिरफ्तारी [6,2,4] है, तो आउटपुट 32 होगा, क्योंकि संभवतः दो पेड़ हो सकते हैं -

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- मेमो नाम का एक नक्शा बनाएं
- एक विधि dp() परिभाषित करें, यह i और j को पैरामीटर के रूप में लेगा। यह इस प्रकार काम करेगा -
- अगर j <=i, तो वापस 0
- यदि (i, j) मेमो में है, तो मेमो वापस करें[(i, j)]
- res :=अनंत
- k के लिए i से j – 1 की श्रेणी में
- res :=res का मिनट, dp(i, k) + dp(k + 1, j) + (इंडेक्स i से k + 1 तक एआर की अधिकतम सबएरे) * k + 1 से एआर की अधिकतम सबएरे से जे + 1
- ज्ञापन[(i, j)] :=res
- रिटर्न मेमो[(i, j)]
- मुख्य विधि इस dp() विधि को - कॉल dp(0, गिरफ्तारी की लंबाई -1) के रूप में बुलाएगी
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
class Solution(object):
def mctFromLeafValues(self, arr):
"""
:type arr: List[int]
:rtype: int
"""
self. memo = {}
def dp(i,j):
if j<=i:
return 0
if (i,j) in self.memo:
return self.memo[(i,j)]
res = float('inf')
for k in range(i,j):
res = min(res,dp(i,k) + dp(k+1,j) + (max(arr[i:k+1])*max(arr[k+1:j+1])))
self.memo[(i,j)]=res
return self.memo[(i,j)]
return dp(0,len(arr)-1) इनपुट
[6,2,4]
आउटपुट
32