最长的å•è°ƒé€’å‡å­åºåˆ—,ä¸åŒ…括连续元素

时间:2017-12-08 02:48:07

标签: algorithm math time-complexity dynamic-programming

例如:

s = <6, 5, 4, 3, 2, 1>, s1 = <6, 4, 1>, s2 = <5, 2>, s3 = <5, 3, 2>

å°†s作为åºåˆ—,s1å’Œs2是è¦è€ƒè™‘的有效å­åºåˆ—,但s3ä¸æ˜¯å› ä¸ºå®ƒåŒ…å«è¿žç»­çš„元素3å’Œ2。

如何找到最长的这样的å­åºåˆ—,使其在O(n^2)中å•è°ƒé€’å‡

我知é“包å«å•è°ƒå¢žåŠ /å‡å°‘的问题的版本。

但这里的附加æ¡ä»¶ä½¿å…¶å˜å¾—困难。

一个简å•çš„解决方案是从i = n'th元素和j = (n-1)'th元素开始,解决就好åƒæ±‚解最长å•è°ƒé€’å‡çš„å­åºåˆ—,åŒæ—¶è€ƒè™‘下一个元素是(i-2)'th并且分别为(j-2)'th并比较两端的长度。这ä»ç„¶ä¼šç»™O(n^2),但看起æ¥ä¼¼ä¹Žå¤ªå¾®ä¸è¶³é“了。

有更好的方法å—?

1 个答案:

答案 0 :(得分:0)

D[i] = max { D[j] + 1 | a[i] < a[j], j < i + 1 } U {1} 

说明:对于æ¯ä¸ªå…ƒç´ a[i],您的动æ€ç¼–程(DP)会检查它之å‰çš„所有数字以åŠè¾ƒä½Žçš„值但ä¸ç›¸é‚» - 如果新数字å¯ç”¨äºŽæ‰©å±•æœ€ä½³åºåˆ—。此外,您还å¯ä»¥é€‰æ‹©å¯åŠ¨æ–°åºåˆ—({1}开始播放时)。

实施例: S =&lt; 6,0,5,8,4,7,6&gt;

D[1] = max { 1 } = 1  // sequence = <6>
D[2] = max {1} = 1  // sequence = <0>
D[3] = max {1, D[0] + 1 } = 2  // sequence = <6, 5>
D[4] = max {1} = 1  // sequence = <8>
D[5] = max{D[3] + 1, D[1] + 1, 1} = 3 // sequence = <6, 5, 4>
D[6] = max{D[4] + 1, 1} = 2  // sequence = <8, 7>
D[7] = max{D[4] + 1, 1} = 2  // sequence = <8, 6>

算法在O(n^2)中è¿è¡Œï¼Œå› ä¸ºè®¡ç®—D[i]需è¦O(i)时间。从算术级数的总和,这总和为O(n^2)以计算所有。

完æˆæ‰€æœ‰D[.]的计算åŽï¼Œè¿­ä»£æ‰€æœ‰std::reference_wrapper,找到最大值。这是在线性时间内完æˆçš„。