तार काटने पर गतिशील प्रोग्रामिंग व्यायाम


16

मैं इस पुस्तक से निम्नलिखित समस्या पर काम कर रहा हूं ।

एक निश्चित स्ट्रिंग-प्रोसेसिंग भाषा एक आदिम संचालन प्रदान करती है जो एक स्ट्रिंग को दो टुकड़ों में विभाजित करती है। चूंकि इस ऑपरेशन में मूल स्ट्रिंग की नकल करना शामिल है, इसलिए कट की स्थिति की परवाह किए बिना, यह लंबाई n की स्ट्रिंग के लिए समय की एन इकाइयां लेता है। मान लीजिए, अब, कि आप कई टुकड़ों में एक स्ट्रिंग को तोड़ना चाहते हैं। जिस क्रम में विराम किया जाता है वह कुल चलने के समय को प्रभावित कर सकता है। उदाहरण के लिए, यदि आप और स्थान पर 20-वर्ण का तार काटना चाहते हैं , तो स्थिति पर पहली कट बनाने से कुल लागत , जबकि स्थिति 10 करने पर पहले की बेहतर लागत ।10 3 20 + 17 = 37 20 + 10 = 30310320+17=3720+10=30

मुझे एक गतिशील प्रोग्रामिंग एल्गोरिथ्म की आवश्यकता है जो कट देता है, स्ट्रिंग को टुकड़ों में काटने की न्यूनतम लागत पाता है ।m + mm+1

जवाबों:


10

मूल विचार है: सभी कट पदों को पहली पसंद के रूप में आज़माएं, संबंधित भागों को पुन: हल करें, लागत जोड़ें और न्यूनतम चुनें।

सूत्र में:

mino(s,C)={|s|,|C|=1|s|+mincC[mino(s1,c,{cCc<c}) + mino(sc+1,|s|,{ccCc>c})], अन्य

ध्यान दें कि इस पुनरावृत्ति के लिए मेमोरेशन लागू करने से वास्तव में किसी भी क्रमिक रूप से लागू किए गए जोड़े के क्रम को स्विच करने के रूप में काम बचाता है, जिसके परिणामस्वरूप एक ही तीन सबप्रोब्लेम्स में कटौती की जाती है।


1

पहले एक पुनरावर्ती एल्गोरिथ्म को खोजना और फिर इसे एक तालिका में बदलना हमेशा एक अच्छा विचार है।

  1. f(C,n)
  2.    अगर (C = ) 0 वापस करें;
  3.    और
  4.      ऑप्ट = अनंत;
  5.      प्रत्येक लिए करते हैंcसी
  6.       D={dC:d<c}
  7.       E={ec:eD,e>c}
  8.       opt=min{opt,f(D,c)+f(E,nc)}
  9.      वापसी ;opt+n

तो आप पूछ सकते हैं: क्या सी के बहुत सारे उपसमुच्चय एक तालिका में नहीं रखे गए हैं? गौर करें कि केवल 'लगातार' सबसेट की जरूरत है। और उनमें से केवल हैं। (क्यों?) एक और समस्या यह है: कुछ प्रविष्टियां में मूल्य बदल देंगी । हम केवल लंबाई निर्दिष्ट करने के बजाय प्रत्येक में प्रारंभ और अंत का संकेत देकर इसके चारों ओर चल सकते हैं ।(n2)E


0

यह एक मल्टीसेट पर क्विकॉर्ट के समान है; यह इष्टतम है जब कट बिंदु मध्य के सबसे करीब है, और फिर हम पुनरावृत्ति करते हैं।

अगर मैंने आपको मल्टीसेट M = {1,1,1..1,2,2 ... 2, ...., m, m..m} का फेरबदल संस्करण दिया है, जहां प्रत्येक कट बिंदु पर रन समाप्त होते हैं , आप पिवट के रूप में बीच में निकटतम कटे हुए को उठाकर इसे करेंगे। तत्वों को बाएं और दाएं विभाजनों में विभाजित करने का संचालन n संचालन को उसी तरह से लेता है जिस तरह से स्ट्रिंग विभाजन होता है, इसलिए आप क्विकॉर्ट के समान ही तर्कों का उपयोग कर सकते हैं कि मंझला इष्टतम है। रों

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.