int print_lis(int *seq, int *ser, int index) { if(index == 0) return -1; print_lis(seq, ser, ser[index]); printf("%d ", seq[index]); }
void print_lis( int n ) { if ( n != -1 ) { print_lis( p[n] ); printf( "%d\n", a[n] ); } }
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]); }
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] ); }
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; }