मैं कठिनाई/घटाने वाली रनटाइम जटिलता के कुछ समाधानों के माध्यम से कदम उठाऊंगा।
सबसे पहले, एक ब्रूट फोर्स समाधान। हर संभव आयत उत्पन्न करें। आप आर 1 ≤ आर 2 और सी 1 ≤ सी 2 के साथ प्रत्येक जोड़ी के अंक (आर 1, सी 1) (आर 2, सी 2) के माध्यम से पुनरावृत्ति करके ऐसा कर सकते हैं (लूप के लिए 4 के साथ किया जा सकता है)। यदि एक आयताकार में 0 नहीं है, तो आप क्षेत्र को अब तक के सबसे बड़े क्षेत्र में तुलना करते हैं। यह एक ओ (आर^3 सी^3) है।
हम ओ (1) को वैध आयत जांच को तेज कर सकते हैं। हम ऐसा करते हैं जहां डीपी (आर, सी) आयत में 0 की संख्या ((1, 1), (आर, सी) स्टोर करता है।
- डी पी (आर, 0) = 0
- डी पी (0, ग) = 0
- डी पी (आर, सी) डी पी = (आर -1, ग) + डी पी (r, ग 1) -dp (आर 1, सी 1) + (मैट्रिक्स [आर] [सी] 0: 1)
तो ((आर 1 में 0 की संख्या, सी 1), (r2, c2)) है
- nzeroes (आर 1, सी 1, आर 2, सी 2) = डी पी [r2] [c2] -dp [r1 -1] [c2] -dp [r2] [c1 -1] + डी पी [ आर 1 -1] [सी 1 -1]
फिर आप जांच सकते हैं कि आयताकार nzeroes (r1, c1, r2, c2) == 0 द्वारा मान्य है या नहीं।
एक साधारण डीपी और एक ढेर का उपयोग करके इसके लिए ओ (आर^2 सी) समाधान है। डीपी अगले कॉल तक सेल के ऊपर 1 कोशिकाओं की संख्या को ढूंढकर प्रति कॉलम काम करता है। डीपी निम्नानुसार है:
डीपी (आर, 0) = 0 डीपी (आर, सी) = 0 मैट्रिक्स [आर] [सी] == 0 डी पी (आर, सी) = डी पी (आर -1, ग) + 1 अन्यथा
फिर आप निम्न कार्य करें:
area = 0
for each row r:
stack = {}
stack.push((height=0, column=0))
for each column c:
height = dp(r, c)
c1 = c
while stack.top.height > height:
c1 = stack.top.column
stack.pop()
if stack.top.height != height:
stack.push((height=height, column=c1))
for item in stack:
a = (c - item.column + 1) * item.height
area = max(area, a)
यह करने के लिए भी संभव है ओ (आरसी) में तीन डीपी का उपयोग करके समस्या को हल करें:
- एच (आर, सी): अगर हम (आर, सी) शुरू करते हैं और ऊपर जाते हैं, तो पहले 0 से पहले हमें कितने 1 कोशिकाएं मिलती हैं?
- एल (आर, सी): हम कितने दूर तक आयत (आर, सी) और ऊंचाई एच (आर, सी) पर नीचे-दाएं कोने के साथ एक आयताकार बढ़ा सकते हैं?
- आर (आर, सी): हम (आर, सी) और ऊंचाई एच (आर, सी) पर नीचे-बाएं कोने के साथ एक आयत का विस्तार कैसे कर सकते हैं?
तीन पुनरावृत्ति संबंधों हैं:
- ज (0, ग) = 0
- ज (आर, सी) = 0 यदि मैट्रिक्स [आर] [सी] == 0
ज (आर, सी) = ज (आर -1, ग) +1 अन्यथा
एल (आर, 0) = 0
- एल (आर, सी) = सीपी अगर मैट्रिक्स [r- 1] [सी] == 0
एल (आर, सी) = मिनट (एल (आर - 1, ग), सी - पी) अन्यथा
आर (आर, सी + 1) = 0
- आर (r, ग) = पीसी अगर मैट्रिक्स [आर 1] [सी] == 0
- आर (r, ग) = मिनट (r (आर - 1, ग), पीसी) अन्यथा
जहां पी पिछले 0 का कॉलम है क्योंकि हम बाएं-दाएं से बाएं और दाएं बाएं से आर को पॉप्युलेट करते हैं।
जवाब तो है:
- max_r, ग (ज (r, ग) * (एल (r, ग) + आर (r, ग) - 1))
यह अवलोकन के कारण काम करता है कि सबसे बड़ा आयताकार हमेशा चारों तरफ 0 (किनारे पर 0 के रूप में कवर होने पर) को स्पर्श करेगा। कम से कम शीर्ष के साथ सभी आयतों पर विचार करके, बाएं और दाएं 0 को स्पर्श करके, हम सभी उम्मीदवार आयतों को कवर करते हैं। हर संभव आयत उत्पन्न करें। आप आर 1 ≤ आर 2 और सी 1 ≤ सी 2 के साथ प्रत्येक जोड़ी के अंक (आर 1, सी 1) (आर 2, सी 2) के माध्यम से पुनरावृत्ति करके ऐसा कर सकते हैं (लूप के लिए 4 के साथ किया जा सकता है)। यदि एक आयताकार में 0 नहीं है, तो आप क्षेत्र को अब तक के सबसे बड़े क्षेत्र में तुलना करते हैं।
नोट: मैंने ऊपर दिए गए उत्तर से here लिखा - "बेन की माँ" अनुभाग का संदर्भ लें। उस लेखन में, 0 पेड़ हैं। उस लेखन में भी बेहतर स्वरूपण है।
thanx। – RATHI
आपको बहुत बहुत धन्यवाद। महान समाधान –