Pagini recente » Cod sursa (job #605528) | Cod sursa (job #2379699) | Cod sursa (job #798581) | Cod sursa (job #3128813) | Cod sursa (job #823228)
Cod sursa(job #823228)
#include <stdio.h>
#include <stdlib.h>
int longestIncreasingSubsequence(const int *seq, int n, int **subseq);int binarySearch(const int *a, int n, int x);int main(void){int n, m, i;int *seq, *subseq;freopen("scmax.in", "r", stdin);freopen("scmax.out", "w", stdout);scanf("%d", &n);seq = (int *)malloc(n * sizeof(int));for (i = 0;i < n;i++){ scanf("%d", seq + i);}
m = longestIncreasingSubsequence(seq, n, &subseq);printf("%d\n", m);for (i = 0;i < m;i++){ printf("%d ", subseq[i]);}
printf("\n");free(seq);free(subseq);return 0;}
int longestIncreasingSubsequence(const int *seq, int n, int **subseq){int i, k, lenq;int *q, *p;q = (int *)malloc(n * sizeof(int));lenq = 0;p = (int *)malloc(n * sizeof(int));for (i = 0;i < n;i++){ k = binarySearch(q, lenq, seq[i]); if (k >= lenq){ lenq++; }
q[k] = seq[i]; p[i] = k;}
k = lenq - 1;for (i = n - 1;i >= 0;i--){ if (p[i] == k){ q[k--] = seq[i]; }
}
free(p);*subseq = q;return lenq;}
int binarySearch(const int *a, int n, int x){int i = 0, j = n - 1, m;while (i <= j){ m = ((i + j)>> 1); if (x == a[m]){ return m; }
if (x <= a[m]){ j = m - 1; } else { i = m + 1; }
}
return i;}