題目描述:給定乙個整型陣列, 求這個陣列的最長嚴格遞增子串行的長度。 譬如序列1 2 2 4 3 的最長嚴格遞增子串行為1,2,4或1,2,3.他們的長度為3。
輸入:輸入可能包含多個測試案例。
對於每個測試案例,輸入的第一行為乙個整數n(1<=n<=100000):代表將要輸入的序列長度
輸入的第二行包括n個整數,代表這個陣列中的數字。整數均在int範圍內。
輸出:對於每個測試案例,輸出其最長嚴格遞增子串行長度。
樣例輸入:
44 2 1 3
51 1 1 1 1
樣例輸出:
21
該題用貪心演算法來做,思路如下:
1、所謂貪心選擇性質是指所求問題的整體最優解可以通過一系列區域性最優的選擇,即貪心選擇來達到。這是貪心演算法可行的第乙個基本要素,也是貪心演算法與動態規劃演算法的主要區別;
2、在這道題中,定義乙個陣列來存放最後的上公升子串行,先將第乙個數存入陣列,對於之後的數,都和第乙個數進行比較,如果大於第乙個數,則存入,否則,使用二分法查詢陣列中第乙個大於該數的數字,替換之;
3、通過這種方法,可以保證陣列中的序列是有序的,而且是相對較小的序列,即有更大的潛力能成為最長子序列。
具體的c++**如下所示:
#include
#include
using namespace std;
int maxlongnodrop(const vector&a)//最長上公升子串行
s.push_back(a[0]);
int i = 1;
for (i = 1; i
else
else
}s[leftn] = a[i];}}
return s.size();
}int main()
;int maxlong = maxlongnodrop(vin);
cout << maxlong << endl;
system("pause");
return 0;
}
最長上公升子串行 LIS 的貪心演算法
我們知道通過dp的演算法可以求出一段序列的最長上公升子串行,時間複雜度為o n 2 下面來介紹一種o nlogn 的演算法來求lis。設一段序列的長度為n,我們需要的是乙個輔助陣列f,長度最長為n,其實際長度是動態的,也表徵了最長上公升子串行的長度。對於f i 其儲存的是對於已經掃瞄過的序列中,所有...
DP之最長上公升子串行
前言 我們先了解一下最長連續遞增子串行的求解!includeusing namespace std 求最長連續遞增序列 define maxn 100000 int n,a maxn dp maxn dp i 即前i個元素的上公升子串行的長度 int main int ans 0 for int i...
DP之最長上公升子串行
def lengthoflis self,nums 處理特殊情況 iflen nums 1 return len nums 儲存 該元素之前 的 最大上公升子串行的長度 mem 1 for in range len nums for j in range 1 len nums 前面的元素都要遍歷一遍...