int print_lis(int *seq, int *ser, int index)
{
    if(index == 0)
        return -1;
    print_lis(seq, ser, ser[index]);
    printf("%d ", seq[index]);
}
Пример #2
0
void print_lis( int n )
{
	if ( n != -1 )
	{
		print_lis( p[n] );
		printf( "%d\n", a[n] );
	}	
}
Пример #3
0
void print_lis(int a[], lis_struct b[], int max_index) {
    if(b[max_index].prev_index == -1) {
        printf("%d ", a[max_index]);
        return;
    }
    print_lis(a, b, b[max_index].prev_index);
    printf("%d ", a[max_index]);
}
Пример #4
0
void main()
{	
	int i, j, k, m, n;
	int len;
						
	i = 0;
	
	while ( scanf( "%d", &n ) != EOF )
	{
		a[i++] = n;
	}
	
	n = i;
		
	memset( p, -1, sizeof( p ) );
	
	len = 0;
	b[0] = 0;
	
	for ( i = 1; i < n; ++i )
	{
		if ( a[i] > a[b[len]] )
		{
			p[i] = b[len];
			b[++len] = i;
			continue;
		}
		
		j = 0;
		k = len;
		
		while ( j < k ) 
		{
			m = ( j + k ) / 2;
			
			if ( a[b[m]] < a[i] ) 
			{
				j = m + 1; 
			}
			else 
			{
				k = m;
			}
		}
		
		if ( j > 0 ) 
		{
			p[i] = b[j - 1];
		}
		
		b[j] = i;			
	}
	
	printf( "%d\n-\n", len + 1 );
	
	print_lis( b[len] );		
}
Пример #5
0
void lis(int a[], int len) {
    lis_struct b[MAX_LEN];
    int i, j;
    int max_index = 0;
    for(i = 0; i < len; i++) {
        b[i].len = 1;
        b[i].prev_index = -1;
        for(j = 0; j < i; j++) {
            if(a[j] <= a[i] && b[j].len >= b[i].len) {
                b[i].len = b[j].len + 1;
                b[i].prev_index = j;
            }
        }
        if(b[i].len > b[max_index].len)
            max_index = i;
    }
    printf("\nthe array b\n");
    for(i = 0; i < len; i++) printf("%d ", b[i].len);
    printf("\n%d\n", b[max_index].len);
    print_lis(a, b, max_index);
    printf("\n");
}
int main()
{

    //int seq[] = {24, 5, 12, 29, 11, 10, 26, 29, 24, 21, 50, 7, 6, 8};
    int seq[] = {24, 5, 12, 29, 11, 10, 26, 32, 2, 5, 7, 29, 37, 83};
    int *lis, *ser, *lis_index;
    int size, i, key, pos, right;
    
    size = sizeof(seq)/sizeof(int);
    lis = (int *)malloc(sizeof(int) * (size+1));
    lis_index = (int *)malloc(sizeof(int) * (size+1));
    ser = (int *)malloc(sizeof(int) * (size+1));
    right = 0;
    lis[0] = INT_MIN;
    lis_index[0] = 0;
    ser[0] = 0;
    
    for(i=0; i<size; i++)
    {
        key = seq[i];
        if(key >= lis[right])
        {
            ser[i] = lis_index[right];
            lis[++right] = key;
            lis_index[right] = i;
        }
        else
        {
            pos = binary_search(lis, 1, right, key);
            lis[pos] = key;
            lis_index[pos] = i;
            ser[i] = lis_index[pos-1];
        }
    }
    print_lis(seq, ser, lis_index[right]);
    printf("\nLength of longest increasing subsequence: %d\n", right);
    return 1;
}