#include<stdio.h>
#include<stdlib.h>
/* lbs() returns the length of the Longest Bitonic Subsequence in
arr[] of size n. The function mainly creates two temporary arrays
lis[] and lds[] and returns the maximum lis[i] + lds[i] - 1.
lis[i] ==> Longest Increasing subsequence ending with arr[i]
lds[i] ==> Longest decreasing subsequence starting with arr[i]
*/
int lbs( int arr[], int n )
{
int i, j;
/* Allocate memory for LIS[] and initialize LIS values as 1 for
all indexes */
int *lis = new int[n];
for (i = 0; i < n; i++)
lis[i] = 1;
/* Compute LIS values from left to right */
for (i = 1; i < n; i++)
for (j = 0; j < i; j++)
if (arr[i] > arr[j] && lis[i] < lis[j] + 1)
lis[i] = lis[j] + 1;
/* Allocate memory for lds and initialize LDS values for
all indexes */
int *lds = new int [n];
for (i = 0; i < n; i++)
lds[i] = 1;
/* Compute LDS values from right to left */
for (i = n-2; i >= 0; i--)
for (j = n-1; j > i; j--)
if (arr[i] > arr[j] && lds[i] < lds[j] + 1)
lds[i] = lds[j] + 1;
/* Return the maximum value of lis[i] + lds[i] - 1*/
int max = lis[0] + lds[0] - 1;
for (i = 1; i < n; i++)
if (lis[i] + lds[i] - 1 > max)
max = lis[i] + lds[i] - 1;
return max;
}
/* Driver program to test above function */
int main()
{
int arr[] = {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5,
13, 3, 11, 7, 15};
int n = sizeof(arr)/sizeof(arr[0]);
printf("Length of LBS is %d\n", lbs( arr, n ) );
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4gCiNpbmNsdWRlPHN0ZGxpYi5oPiAKICAKLyogbGJzKCkgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBMb25nZXN0IEJpdG9uaWMgU3Vic2VxdWVuY2UgaW4gCiAgICBhcnJbXSBvZiBzaXplIG4uIFRoZSBmdW5jdGlvbiBtYWlubHkgY3JlYXRlcyB0d28gdGVtcG9yYXJ5IGFycmF5cyAKICAgIGxpc1tdIGFuZCBsZHNbXSBhbmQgcmV0dXJucyB0aGUgbWF4aW11bSBsaXNbaV0gKyBsZHNbaV0gLSAxLiAKICAKICAgIGxpc1tpXSA9PT4gTG9uZ2VzdCBJbmNyZWFzaW5nIHN1YnNlcXVlbmNlIGVuZGluZyB3aXRoIGFycltpXSAKICAgIGxkc1tpXSA9PT4gTG9uZ2VzdCBkZWNyZWFzaW5nIHN1YnNlcXVlbmNlIHN0YXJ0aW5nIHdpdGggYXJyW2ldIAoqLwppbnQgbGJzKCBpbnQgYXJyW10sIGludCBuICkgCnsgCiAgIGludCBpLCBqOyAKICAKICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBMSVNbXSBhbmQgaW5pdGlhbGl6ZSBMSVMgdmFsdWVzIGFzIDEgZm9yIAogICAgICBhbGwgaW5kZXhlcyAqLwogICBpbnQgKmxpcyA9IG5ldyBpbnRbbl07IAogICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSAKICAgICAgbGlzW2ldID0gMTsgCiAgCiAgIC8qIENvbXB1dGUgTElTIHZhbHVlcyBmcm9tIGxlZnQgdG8gcmlnaHQgKi8KICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykgCiAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIAogICAgICAgICBpZiAoYXJyW2ldID4gYXJyW2pdICYmIGxpc1tpXSA8IGxpc1tqXSArIDEpIAogICAgICAgICAgICBsaXNbaV0gPSBsaXNbal0gKyAxOyAKICAKICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBsZHMgYW5kIGluaXRpYWxpemUgTERTIHZhbHVlcyBmb3IgCiAgICAgIGFsbCBpbmRleGVzICovCiAgIGludCAqbGRzID0gbmV3IGludCBbbl07IAogICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSAKICAgICAgbGRzW2ldID0gMTsgCiAgCiAgIC8qIENvbXB1dGUgTERTIHZhbHVlcyBmcm9tIHJpZ2h0IHRvIGxlZnQgKi8KICAgZm9yIChpID0gbi0yOyBpID49IDA7IGktLSkgCiAgICAgIGZvciAoaiA9IG4tMTsgaiA+IGk7IGotLSkgCiAgICAgICAgIGlmIChhcnJbaV0gPiBhcnJbal0gJiYgbGRzW2ldIDwgbGRzW2pdICsgMSkgCiAgICAgICAgICAgIGxkc1tpXSA9IGxkc1tqXSArIDE7IAogIAogIAogICAvKiBSZXR1cm4gdGhlIG1heGltdW0gdmFsdWUgb2YgbGlzW2ldICsgbGRzW2ldIC0gMSovCiAgIGludCBtYXggPSBsaXNbMF0gKyBsZHNbMF0gLSAxOyAKICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykgCiAgICAgaWYgKGxpc1tpXSArIGxkc1tpXSAtIDEgPiBtYXgpIAogICAgICAgICBtYXggPSBsaXNbaV0gKyBsZHNbaV0gLSAxOyAKICAgcmV0dXJuIG1heDsgCn0gCiAgCi8qIERyaXZlciBwcm9ncmFtIHRvIHRlc3QgYWJvdmUgZnVuY3Rpb24gKi8KaW50IG1haW4oKSAKeyAKICBpbnQgYXJyW10gPSB7MCwgOCwgNCwgMTIsIDIsIDEwLCA2LCAxNCwgMSwgOSwgNSwgCiAgICAgICAgICAgICAgMTMsIDMsIDExLCA3LCAxNX07IAogIGludCBuID0gc2l6ZW9mKGFycikvc2l6ZW9mKGFyclswXSk7IAogIHByaW50ZigiTGVuZ3RoIG9mIExCUyBpcyAlZFxuIiwgbGJzKCBhcnIsIG4gKSApOyAKICByZXR1cm4gMDsgCn0g