dynamic-programming
रॉड काटना
खोज…
अधिकतम लाभ प्राप्त करने के लिए रॉड को काटना
लंबाई n इंच की एक छड़ और कीमतों की लंबाई मीटर की एक सरणी है जिसमें n से छोटे आकार के सभी टुकड़े शामिल हैं। हमें रॉड को काटकर और टुकड़ों को बेचकर अधिकतम मूल्य प्राप्त करना होगा। उदाहरण के लिए, यदि छड़ की लंबाई 8 है और विभिन्न टुकड़ों के मान निम्नानुसार दिए गए हैं, तो अधिकतम प्राप्य मान 22 है ।
+---+---+---+---+---+---+---+---+
(price)| 1 | 5 | 8 | 9 | 10| 17| 17| 20|
+---+---+---+---+---+---+---+---+
हम एक 2 डी सरणी डीपी [एम] [एन + 1] का उपयोग करेंगे जहां एन रॉड की लंबाई है और एम मूल्य सरणी की लंबाई है। हमारे उदाहरण के लिए, हमें dp [8] [९] की आवश्यकता होगी। यहाँ dp [i] [j] लंबाई की रॉड को बेचकर अधिकतम मूल्य का निरूपण किया जाएगा। हमारे पास लंबाई j का अधिकतम मान हो सकता है या हम लाभ को अधिकतम करने के लिए लंबाई को तोड़ सकते हैं।
सबसे पहले, 0 कॉलम के लिए, यह कुछ भी योगदान नहीं करेगा इसलिए सभी मानों को 0. के रूप में चिह्नित किया जाएगा। इसलिए 0 वें कॉलम के सभी मान 0. होंगे। dp [0] [1] के लिए , हम अधिकतम मूल्य प्राप्त कर सकते हैं। बेचने की लंबाई की लंबाई 1. यह लंबाई के लिए 1.Similarly 2 डीपी की रॉड के लिए होगा [0] [2] हमारे पास 2 (1 + 1) हो सकता है। यह डीपी तक जारी है [0] [8] । पहली पुनरावृत्ति के बाद। हमारी डीपी [] सरणी की तरह दिखेगा।
+---+---+---+---+---+---+---+---+---+
(price)| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+---+---+---+---+---+---+---+---+---+
(1) 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
+---+---+---+---+---+---+---+---+---+
(5) 2 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
(8) 3 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
(9) 4 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
(10) 5 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
(17) 6 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
(17) 7 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
(20) 8 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
Dp [2] [2] के लिए हम खुद से पूछते हैं कि अगर मैं रॉड को दो टुकड़ों (1,1) में तोड़ता हूं या पूरी (लंबाई = 2) के रूप में रॉड ले रहा हूं तो हम क्या देख सकते हैं। अगर मैं रॉड को दो टुकड़ों में तोड़ता हूं तो अधिकतम लाभ जो मैं कर सकता हूं वह 2 है और अगर मेरे पास रॉड है तो मैं इसे 5. के लिए बेच सकता हूं। दूसरी पुनरावृत्ति के बाद डीपी [] सरणी की तरह दिखेगा:
+---+---+---+---+---+---+---+---+---+
(price)| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+---+---+---+---+---+---+---+---+---+
(1) 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
+---+---+---+---+---+---+---+---+---+
(5) 2 | 0 | 1 | 5 | 6 | 10| 11| 15| 16| 20|
+---+---+---+---+---+---+---+---+---+
(8) 3 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
(9) 4 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
(10) 5 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
(17) 6 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
(17) 7 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
(20) 8 | 0 | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
तो dp [i] [j] की गणना करने के लिए हमारा सूत्र दिखेगा:
if j>=i
dp[i][j] = Max(dp[i-1][j], price[i]+arr[i][j-i]);
else
dp[i][j] = dp[i-1][j];
अंतिम पुनरावृत्ति के बाद हमारा dp [] एरे जैसा दिखेगा
+---+---+---+---+---+---+---+---+---+
(price)| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+---+---+---+---+---+---+---+---+---+
(1) 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
+---+---+---+---+---+---+---+---+---+
(5) 2 | 0 | 1 | 5 | 6 | 10| 11| 15| 16| 20|
+---+---+---+---+---+---+---+---+---+
(8) 3 | 0 | 1 | 5 | 8 | 10| 13| 16| 18| 21|
+---+---+---+---+---+---+---+---+---+
(9) 4 | 0 | 1 | 5 | 8 | 10| 13| 16| 18| 21|
+---+---+---+---+---+---+---+---+---+
(10) 5 | 0 | 1 | 5 | 8 | 10| 13| 16| 18| 21|
+---+---+---+---+---+---+---+---+---+
(17) 6 | 0 | 1 | 5 | 8 | 10| 13| 17| 18| 22|
+---+---+---+---+---+---+---+---+---+
(17) 7 | 0 | 1 | 5 | 8 | 10| 13| 17| 18| 22|
+---+---+---+---+---+---+---+---+---+
(20) 8 | 0 | 1 | 5 | 8 | 10| 13| 17| 18| 22|
+---+---+---+---+---+---+---+---+---+
हम परिणाम dp [n] [m + 1] पर होगा ।
जावा में कार्यान्वयन
public int getMaximumPrice(int price[],int n){
int arr[][] = new int[n][price.length+1];
for(int i=0;i<n;i++){
for(int j=0;j<price.length+1;j++){
if(j==0 || i==0)
arr[i][j] = 0;
else if(j>=i){
arr[i][j] = Math.max(arr[i-1][j], price[i-1]+arr[i][j-i]);
}else{
arr[i][j] = arr[i-1][j];
}
}
}
return arr[n-1][price.length];
}
समय जटिलता
O(n^2)