दासब्लिंकनलाइट की तरह, यह करने का सबसे प्रभावी तरीका एक ज्ञापन या गतिशील प्रोग्रामिंग तकनीक का उपयोग कर रहा है। मैं गतिशील प्रोग्रामिंग पसंद करते हैं, लेकिन मैं यहां शुद्ध रिकर्सन का उपयोग करूंगा।
उत्तर एक मौलिक प्रश्न के उत्तर के आसपास केंद्र है: "यदि मैं अपने क्षेत्र में पंक्ति आर और कॉलम सी में वर्ग में हूं, तो मैं यहां बाईं ओर से पथ का मूल्यांकन कैसे कर सकता हूं जैसे कि संख्या स्ट्रॉबेरी अधिकतम है? "
एहसास करने की कुंजी यह है कि पंक्ति आर और कॉलम सी में साजिश में आने के केवल दो तरीके हैं: या तो मैं ऊपर से वहां जा सकता हूं, पंक्ति आर -1 और कॉलम सी में साजिश का उपयोग करके, या मैं प्राप्त कर सकता हूं पंक्ति आर और कॉलम सी -1 में साजिश का उपयोग करके, तरफ से।
int[][] field;
int max(int r, int c) {
//Base case
if (r == 0 && c == 0) {
return field[r][c];
}
//Assuming a positive number of strawberries in each plot, otherwise this needs
//to be negative infinity
int maxTop = -1, maxLeft = -1;
//We can't come from the top if we're in the top row
if (r != 0) {
maxTop = field[r-1][c];
}
//Similarly, we can't come from the left if we're in the left column
if (c != 0) {
maxLeft = field[r][c-1];
}
//Take whichever gives you more and return..
return Math.max(maxTop, maxLeft) + field[r][c];
}
कॉल अधिकतम (आर -1, सी -1) के लिए: उसके बाद, आप बस सुनिश्चित करें कि आप अपने आधार मामलों पता है ... जिसका अर्थ है की तरह कुछ, मौलिक रूप से, मेरे विशुद्ध रूप से पुनरावर्ती संस्करण होगा बनाने की जरूरत है अपना जवाब प्राप्त करें। ध्यान दें कि यहां बहुत अक्षमता है; आप गतिशील प्रोग्रामिंग (जो मैं नीचे प्रदान करूंगा) या ज्ञापन (जिसे पहले ही परिभाषित किया गया है) का उपयोग करके बहुत बेहतर करूँगा। हालांकि, याद रखने की बात यह है कि डीपी और ज्ञापन तकनीक दोनों ही अधिक कुशल तरीके हैं जो यहां उपयोग किए जाने वाले पुनरावर्ती सिद्धांतों से आती हैं।
डी पी:
int maxValue(int[][] field) {
int r = field.length;
int c = field[0].length;
int[][] maxValues = new int[r][c];
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (i == 0 && j == 0) {
maxValues[i][j] = field[i][j];
} else if (i == 0) {
maxValues[i][j] = maxValues[i][j-1] + field[i][j];
} else if (j == 0) {
maxValues[i][j] = maxValues[i-1][j] + field[i][j];
} else {
maxValues[i][j] = Math.max(maxValues[i][j-1], maxValues[i-1][j]) + field[i][j];
}
}
}
return maxValues[r-1][c-1];
}
दोनों ही मामलों में, यदि आप वास्तविक पथ से बनाना चाहते हैं, बस बूलियन्स कि साथ मेल खाती है की एक 2D तालिका रखना "मैं ऊपर या बाईं ओर से आया था?" यदि सबसे स्ट्रॉबेरी पथ ऊपर से आता है, तो सही रखें, अन्यथा झूठी डालें। इससे आपको गणना के बाद पैच को पुनः प्राप्त करने की अनुमति मिल सकती है।
ध्यान दें कि यह अभी भी प्रिंसिपल में रिकर्सिव है: प्रत्येक चरण में, हम अपने पिछले परिणामों पर वापस देख रहे हैं। हम अपने पिछले परिणामों को कैशिंग करते हैं, इसलिए हम काम का एक गुच्छा बर्बाद नहीं करते हैं, और हम एक बुद्धिमान क्रम में उपप्रोबम पर हमला कर रहे हैं ताकि हम उन्हें हमेशा हल कर सकें। गतिशील प्रोग्रामिंग पर अधिक जानकारी के लिए, Wikipedia देखें।
क्या इसे रिकर्सिव होना चाहिए? एक पुनरावृत्ति यहां आसान होगा। –
हां, इसे रिकर्सिव होना चाहिए। – user1547050
खैर, दासब्लिंकलाइट का जवाब अच्छी तरह से काम करता है, आपको बस यह भी ट्रैक करना होगा कि क्या नीचे जा रहा है या सही संख्या बड़ी संख्या में पैदा होती है। –