問題描述犯懶(手動抱拳)
優化前:
優化是第二層迴圈用二分搜尋遍歷,自己不理解所以嘗試了一下優化前,可以直接看優化後
dp[i] = 長度為i+1的上公升子串行末尾元素的最小值(不斷更新,dp陣列中最後存的不一定是得到的最長上公升子串行,比如說原來存的是,但是在遇到1之後dp會更新)
優化後,二分搜尋代替迴圈#include#include#include#include#include#include#include#include#define max 110000
#define inf 10000000
using namespace std;
int n, a[max];
int dp[max];
int ans;
//dp
void dp()
} }//找答案
for(int i=0; i> n;
for(int i=0; i> a[i];
dp();
cout << ans << endl;
in.close();
return 0;
}
#include#include#include#include#include#include#include#include#define max 110000
#define inf 10000000
using namespace std;
int n, a[max];
int dp[max];
int ans;
//dp
void dp()
} }//找答案
for(int i=0; i> n;
for(int i=0; i> a[i];
dp();
cout << ans << endl;
in.close();
return 0;
}
最長上公升子串行(LIS)問題
問題描述 給定乙個序列 a1,a2,an 求它的乙個子串行 ak1,ak2,aki 不一定連續 使得該子串行滿足ak1 ak2 akn且長度最長,如序列 1,7,3,5,9,4,8 的乙個lis是 1,3,5,8 遞迴表示式 作如下定義 由以上定義可得如下遞迴表示式 則原問題最優解為max int ...
最長上公升子串行問題 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
題目 兩道題幾乎一樣,只不過對於輸入輸出的要求有所不同罷了。lis有兩種方法 一 第一種方法 時間複雜度為o n 2 狀態 dp i 區間為0 i的序列的lis 轉移方程 dp i max 1,dp k 1 0 k include include include include using name...