अवधारणा
किसी दिए गए सरणी A के संबंध में N तत्व और दो पूर्णांक l और r हैं, जहाँ, 1≤ ax ≤ 10 5 और 1≤ l≤ r≤ N. हम सरणी के किसी भी तत्व का चयन कर सकते हैं (मान लें ax) और इसे हटा दें, और ax के बराबर सभी तत्वों को भी हटा दें +1, एक<उप>xउप> +2 ... ए<उप>xउप> +R और ax -1, ए<उप>एक्सउप> -2 … ए<उप>एक्सउप> -एल सरणी से। इस कदम पर कुल्हाड़ी के अंक खर्च होंगे। हमारा काम सरणी से सभी तत्वों को हटाने के बाद कुल लागत को अधिकतम करना है।
इनपुट
2 1 2 3 2 2 1 l = 1, r = 1
आउटपुट
8
यहां, हम हटाने के लिए 2 चुनते हैं, फिर (2-1)=1 और (2+1)=3 को क्रमशः दिए गए l और r श्रेणी के लिए हटाना होगा।
इसे तब तक दोहराएं जब तक 2 पूरी तरह से निकल न जाए। तो, कुल लागत =2*4 =8.
इनपुट
2 4 2 10 5 l = 1, r = 2
आउटपुट
18
यहां, हम हटाने के लिए 2 चुनते हैं, फिर 5 और फिर 10.
तो कुल लागत =2*2 + 5 + 10 =19.
विधि
अब, हम सभी तत्वों की गिनती निर्धारित करेंगे। मान लें कि एक तत्व एक्स चुना गया है, तो श्रेणी [एक्स-एल, एक्स + आर] में एलीमेंट हटा दिए जाएंगे। वर्तमान में, हम भूमि r से न्यूनतम सीमा चुनते हैं और यह निर्धारित करते हैं कि तत्व X के चुने जाने पर किन तत्वों को हटाया जाना है। परिणाम पहले हटाए गए तत्वों में से अधिकतम होंगे और जब तत्व X हटा दिया जाएगा। अब, हम पहले से हटाए गए तत्वों के परिणाम को संग्रहीत करने और इसे आगे लागू करने के लिए गतिशील प्रोग्रामिंग लागू करेंगे।
उदाहरण
// C++ program to find maximum cost after // deleting all the elements form the array #include <bits/stdc++.h> using namespace std; // Shows function to return maximum cost obtained int maxCost(int a[], int m, int L, int R){ int mx1 = 0, k1; // Determine maximum element of the array. for (int p = 0; p < m; ++p) mx1 = max(mx1, a[p]); // Used to initialize count of all elements to zero. int count1[mx1 + 1]; memset(count1, 0, sizeof(count1)); // Compute frequency of all elements of array. for (int p = 0; p < m; p++) count1[a[p]]++; // Used to store cost of deleted elements. int res1[mx1 + 1]; res1[0] = 0; // Choosing minimum range from L and R. L = min(L, R); for (int num1 = 1; num1 <= mx1; num1++) { // Determines upto which elements are to be // deleted when element num is selected. k1 = max(num1 - L - 1, 0); // Obtain maximum when selecting element num or not. res1[num1] = max(res1[num1 - 1], num1 * count1[num1] + res1[k1]); } return res1[mx1]; } // Driver program int main(){ int a1[] = { 1, 1, 3, 3, 3, 2, 4 }, l1 = 1, r1 = 1; int a2[] = { 2, 4, 2, 10, 5 }, l2 = 1, r2 = 2; // size of array int n1 = sizeof(a1) / sizeof(a1[0]); int n2 = sizeof(a2) / sizeof(a2[0]); // function call to find maximum cost cout<<"Maximum Cost for First Example:" << maxCost(a1, n1, l1,r1)<<endl; cout<<"Maximum Cost for Second Example:" << maxCost(a2, n2, l2,r2); return 0; }
आउटपुट
Maximum Cost for First Example:11 Maximum Cost for Second Example:19