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