Pagini recente » Cod sursa (job #1111205) | Cod sursa (job #2133021) | Cod sursa (job #1440610) | Cod sursa (job #818479) | Cod sursa (job #911428)
Cod sursa(job #911428)
#include <stdio.h>
#include <stdlib.h>
int LIS(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);
}
subseq = (int *) malloc(n * sizeof(int));
m = LIS(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 LIS(const int *seq, int n, int *subseq)
{
int i, k, lenq;
int *q, *p;
q = subseq; /* Aici voi avea LIS */
lenq = 0; /* Lungimea lui q */
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);
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;
}