根據《程式設計之美》中解法二的思路,發現記錄lis陣列是不必要的,只要直接不斷更新maxv即可。
在遍歷整個陣列arr的過程中,maxv陣列的長度也在不斷增加。當遍歷到arr[i]時,maxv[j]中已經記錄了由arr[0]~arr[i]的序列可以得到的所有長度為j的子串行中最大元素的最小值。例如:arr=;
當i=2時,arr[0]~arr[i]=,可以得到長度為1的子串行有,,,則取每個序列最大值中最小的乙個maxv[1]=-1;長度為2的子串行有,,則去maxv[2]=2;
當i=3時,maxv[1]=-2,maxv[2]=2
當i=4時,maxv[1]=-2,maxv[2]=2,maxv[3]=3
並且可以知道maxv是遞增的不可能存在maxv[x]>maxv[y],其中xmaxv[j]那就沒必要繼續比較arr[i]>maxv[x],x
#include #include using namespace std;
int lis(const vector&arr)
if (arr[i]arr;
arr.push_back(1);
arr.push_back(-1);
arr.push_back(2);
arr.push_back(4);
arr.push_back(4);
arr.push_back(-5);
arr.push_back(6);
arr.push_back(7);
arr.push_back(-3);
arr.push_back(6);
arr.push_back(8);
cout<
可能的最大子串行或者
求陣列中最長遞增子串行
原文見 分析過程很清楚。這裡主要是 部分有改動。完全用c寫的,從檔案中讀入。另外,解法二的程式加了去重,求的是最長單調遞增子串行。求陣列中最長遞增子串行 寫乙個時間複雜度盡可能低的程式,求乙個一維陣列 n個元素 中的最長遞增子串行的長度。例如 在序列1,1,2,3,4,5,6,7中,其最長的遞增子串...
求陣列中最長遞增子串行
最長遞增子串行,longest increasing subsequence 下面我們簡記為 lis。排序 lcs演算法 以及 dp演算法就忽略了,這兩個太容易理解了。假設存在乙個序列d 1.9 2 1 5 3 6 4 8 9 7,可以看出來它的lis長度為5。下面一步一步試著找出它。我們定義乙個序...
求陣列中最長遞增子串行
程式設計之美有一道關於陣列中最長遞增子串行,題目如下 寫乙個時間複雜度盡可能低的程式,求乙個一維陣列 n個元素 中最長遞增子串行的長度。例如在序列1,1,2,3,4,5,6,7中,其最長的遞增子串行的長度為4 如1,2,4,6 從該書給的例子我們可以知道的是其最長的遞增子串行可以不連續的。作者利用動...