dp--LIS
Longest Increasing Subsequence
求最长上升子序列
定义\(dp[i]\)表示以\(i\)结尾的最长上升子序列的长度,O(\(n^2\))
for(int i = 1; i <= n; i++)
{
for(int j = 1; j < i; j++)
{
if(a[i] > a[j]) dp[i] = max(dp[i],dp[j]+1);
}
}
定义\(dp[i]\)表示长度为\(len\)的上升子序列的第\(i\)个数,O(\(nlogn\))
int b[maxn];b[1] = a[1];
int len = 1;
for(int i = 2; i <= n; i++)
{
if(a[i] > b[len]) b[++len] = a[i];
else *lower_bound(b+1,b+len+1,a[i]) = a[i];
}
求最长上升子序列的划分,等于求最长不上升子序列的长度
比如4 1 5 9 2
可以划分成4 5 6 , 1 2
最长不上升子序列9 2