例如:
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)
,但看起æ¥ä¼¼ä¹Žå¤ªå¾®ä¸è¶³é“了。
有更好的方法å—?
ç”案 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
,找到最大值。这是在线性时间内完æˆçš„。