問題描述
給定乙個序列(a1, a2, ..., an),求它的乙個子串行(ak1, ak2, ..., aki) (不一定連續),使得該子串行滿足ak1 < ak2 < ... < akn且長度最長,如序列(1, 7, 3, 5, 9, 4, 8)的乙個lis是(1, 3, 5, 8)
遞迴表示式
作如下定義
由以上定義可得如下遞迴表示式
則原問題最優解為max
**
int n;
int a[1000]; //a儲存輸入序列
int e[1000]; //e[i]表示必須以a[i]結尾的序列的lis長度
int ee;
int e_max;
int dp()
e[i] = ee+1; //若a[i]最小,則e[i] = 1,否則e[i] = ee+1
} e_max = int_min; //e_max表示(e[0],e[1],...,e[n-1])的最大值,即原問題的最優解,初始化為int_min
for(int i = 0; i < n; i++)
e_max = (e[i] > e_max) ? e[i] : e_max;
return e_max;
}
最長上公升子串行問題 LIS
有乙個長為n的數列a0,a1,a n 1 請求出這個序列中最長的上公升子串行的長度。上公升子串行指的是對於任意的i限制條件 1 n 1000,0 ai 1000000 樣例輸入 n 5 a 輸出 3 a1,a2,a4構成的子串行 最長上公升子串行 lis,longest increasing sub...
最長上公升子串行LIS問題
問題描述犯懶 手動抱拳 優化前 優化是第二層迴圈用二分搜尋遍歷,自己不理解所以嘗試了一下優化前,可以直接看優化後 dp i 長度為i 1的上公升子串行末尾元素的最小值 不斷更新,dp陣列中最後存的不一定是得到的最長上公升子串行,比如說原來存的是,但是在遇到1之後dp會更新 include inclu...
最長上公升子串行 LIS
題目 兩道題幾乎一樣,只不過對於輸入輸出的要求有所不同罷了。lis有兩種方法 一 第一種方法 時間複雜度為o n 2 狀態 dp i 區間為0 i的序列的lis 轉移方程 dp i max 1,dp k 1 0 k include include include include using name...