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)

Program in C# 
**************************************************************
class Bitonic
{
    private static int Maximum(int []arr,int size)
    {
        int []bc=new int[size];        
        int i,j,max=1;        
        bc[0]=1;        
        for(i=1;i<size;i++)
        {
            bc[i]=1;
            for(j=i-1;j>=0;j--)
            {
                if((bc[i]<bc[j]+1) && arr[i]>arr[j])
                {
                    bc[i]=bc[j]+1;
                }
            }
            if(bc[i]>max)
            {
                max=bc[i];
            }
        }       
        bc[size-1]=1;
        
        for(i=size-2;i>=0;i--)
        {
            int prv=bc[i];
            bc[i]=1;
            for(j=i+1;j<size;j++)
            {
                if((bc[i]<bc[j]+1) && arr[i] > arr[j])
                {
                    bc[i]=bc[j]+1;
                }
            }            
            if(prv+bc[i]-1 > max)
            {
                max=prv+bc[i]-1;
            }
        }
        return max;
    }
    public static int GetMaxLength(int []array)
    {
        return Maximum(array,array.Length);
    }
}

class Program{
  public static void Main(string[] args){            
    int len=Bitonic.GetMaxLength(new int[]{806030402010});
  }
}


Thats it , This is the logic for bitonic subsequence
dynamic programming approach here. For sake of simplicity , assume we need to find only the maximal length of such sequence.