Longest Bitonic Subsequence
Given an array arr[0 ... n-1] containing n positive integers, a subsequence of arr[] is called Bitonic if it is first increasing, then decreasing. Write a function that takes an array as argument and returns the length of the longest bitonic subsequence.A sequence, sorted in increasing order is considered Bitonic with the decreasing part as empty. Similarly, decreasing order sequence is considered Bitonic with the increasing part as empty.
Examples:
Input arr[] = {1, 11, 2, 10, 4, 5, 2, 1};
Output: 6 (A Longest Bitonic Subsequence of length 6 is 1, 2, 10, 4, 2, 1)
Input arr[] = {12, 11, 40, 5, 3, 1}
Output: 5 (A Longest Bitonic Subsequence of length 5 is 12, 11, 5, 3, 1)
Input arr[] = {80, 60, 30, 40, 20, 10}
Output: 5 (A Longest Bitonic Subsequence of length 5 is 80, 60, 30, 20, 10)
算法是根据我的另一篇博客改变而来的:
http://blog.youkuaiyun.com/kenden23/article/details/18350315
这里的技巧是两边扫描,然后合起来,时间效率也是O(n*n),和求最大递增子段和一样。
两边扫描是个经典技巧,一定要记得,掌握。
Geeks上原文和我的算法效率一样,处理起来有区别。
int lbsMyDP( int arr[], int n )
{
vector<int> ta(n, 1);
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (arr[j] > arr[i]) ta[j] = ta[i]+1;
}
if (i > 1) ta[i] = max(ta[i], ta[i-1]);
}
vector<int> ta2(n, 1);
for (int i = n - 1; i >= 0 ; i--)
{
for (int j = i - 1; j >= 0 ; j--)
{
if (arr[j] > arr[i]) ta2[j] = ta2[i]+1;
}
if (i < n - 1) ta2[i] = max(ta2[i], ta2[i+1]);
}
int len = 0;
for (int i = 1; i < n; i++)
{
len = max(ta[i-1]+ta2[i], len);
}
return len;
}
本文介绍了一种通过双向扫描数组来查找最长单调递增后递减序列的方法,此方法的时间复杂度为O(n^2),与求最大递增子序列长度的算法相似。通过对比Geeks上的原文,展示了改进之处并提供了具体的实现代码。
88

被折叠的 条评论
为什么被折叠?



