当我们学会了最长上升子序列长度的求法后,只需要改动一点点就可以求出最长下降子序列的长度了:
最长上升子序列的所有元素全加上负号不就变成最长下降子序列(LDS)了!
如果想求LDS的长度,直接把所有元素加上负号,然后求LIS的长度,求得的就是LDS的长度!
int LDSOnlogn()
{
dp[1] = -a[1];
int maxlen = 1;
int pos;
for(int i=2 ; i<=n ; i++)
{
if( -a[i] > dp[maxlen] )
{
maxlen++;
dp[maxlen] = -a[i];
}
else
{
pos = binFind(-a[i], 1, maxlen); //二分查找dp[]中第一个大于等于-a[i]的元素的位置
dp[pos] = -a[i];
}
}
return maxlen;
}
不想打这么多代码的话也可以用algorithm头文件中的lower_bound()函数,具体用法可参考:http://c.biancheng.net/view/7521.html
例题:POJ1065