यह इस समस्या के रूप में ही है: नीचे मैं तुम्हें एक सीडी (रों) विधि (जो एक चार dict जिससे आपको पता चलता रिटर्न दे http://code.google.com/codejam/contest/1781488/dashboard#s=p2
http://code.google.com/codejam/contest/1781488/dashboard#s=a&a=2
कोड में जहां अगले या पिछले चार स्ट्रिंग में वह char के बराबर है)। एक गतिशील प्रोग्रामिंग समाधान को लागू करने के लिए इसका उपयोग करें जिसके लिए मैंने आपको नमूना कोड भी दिया है।
गतिशील प्रोग्रामिंग के साथ केवल लेन (एस 1) * लेन (एस 1)/2 राज्य हैं इसलिए ऑर्डर (एन^2) संभव है।
विचार या तो एस 1 से चार लेना है या इसे नहीं लेना है। यदि आप एस 1 को बंद करते हैं, तो आपको इसे आगे और पीछे (एस 1 और एस 2 दोनों) से ले जाना चाहिए। यदि आप इसे नहीं लेते हैं, तो आप आगे बढ़ते हैं 1. (इसका मतलब है कि एस 2 की स्थिति एस 1 की स्थिति के साथ समन्वयित होती है क्योंकि आप हमेशा दोनों के बाहर से लालची लेते हैं - इसलिए आप केवल चिंता करते हैं कि एस 1 के कितने राज्य हो सकते हैं)।
यह कोड आपको सबसे अधिक तरीके से प्राप्त करता है। सीडी 1 (चार ताना 1) आपको अगले चरित्र को उस चार्ट के बराबर एस 1 में ढूंढने में मदद करता है जो आप हैं (आगे और पीछे दोनों)।
पुनरावर्ती हल() विधि में आपको यह तय करने की आवश्यकता है कि start1, end1 .. आदि होना चाहिए। 2 कुल में जोड़े हर बार जब आप एक चरित्र ले -
s1 = "afbcdfca"
s2 = "bcadfcgyfka"
def cd(s):
"""returns dictionary d where d[i] = j where j is the next occurrence of character i"""
char_dict = {}
last_pos = {}
for i, char in enumerate(s):
if char in char_dict:
_, forward, backward = char_dict[char]
pos = last_pos[char]
forward[pos] = i
backward[i] = pos
last_pos[char] = i
else:
first, forward, backward = i, {}, {}
char_dict[char] = (first, forward, backward)
last_pos[char] = i
return char_dict
print cd(s1)
"""{'a': ({0: 7}, {7: 0}), 'c': ({3: 6}, {6: 3}), 'b': ({}, {}), 'd': ({}, {}), 'f': ({1: 5}, {5: 1})}"""
cd1, cd2 = cd(s1), cd(s2)
cache = {}
def solve(start1, end1, start2, end2):
state = (start1, end1)
answer = cache.get(state, None)
if answer:
return answer
if start1 < end1:
return 0
c1s, c1e = s1[start1], s1[end1]
c2s, c2e = s2[start2], s2[end2]
#if any of c1s, c1e, c2s, c2e are equal and you don't take, you must
#skip over those characters too:
dont_take_end1 = solve(start1, end1 - 1, start2, end2)
do_take_end1 = 2
if do_take_end1:
end1_char = s1[end1]
#start1 = next character along from start1 that equals end1_char
#end1 = next char before end1 that equals end1_char
#end2 = next char before end2 that..
#start2 = next char after .. that ..
do_take_end1 += solve(start1, end1, start2, end2)
answer = cache[state] = max(dont_take_end1, do_take_end1)
return answer
print solve(0, len(s1), 0, len(s2))
पर समान बात यह है कि इसे पैलिंड्रोम के साथ क्या करना है? –
आह, मैं देखता हूं, एलसीपीएस "afcfa" है, न कि "afca"। –
गतिशील प्रोग्रामिंग प्रश्न। कृपया w.r.t डीपी –