Sunteți pe pagina 1din 1

1 #include <stdio.

h>
2
3 #define maxim(a, b) ((a > b) ? a : b)
4 #define FOR(i, a, b) for (i = a; i <= b; ++i)
5 #define NMax 1024
6
7 int M, N, A[NMax], B[NMax], D[NMax][NMax], sir[NMax], bst;
8
9 int main(void)
10 {
11 int i, j;
12
13 freopen("cmlsc.in", "r", stdin);
14 freopen("cmlsc.out", "w", stdout);
15
16 scanf("%d %d", &M, &N);
17 FOR (i, 1, M)
18 scanf("%d", &A[i]);
19 FOR (i, 1, N)
20 scanf("%d", &B[i]);
21
22 FOR (i, 1, M)
23 FOR (j, 1, N)
24 if (A[i] == B[j])
25 D[i][j] = 1 + D[i-1][j-1];
26 else
27 D[i][j] = maxim(D[i-1][j], D[i][j-1]);
28
29 for (i = M, j = N; i; )
30 if (A[i] == B[j])
31 sir[++bst] = A[i], --i, --j;
32 else if (D[i-1][j] < D[i][j-1])
33 --j;
34 else
35 --i;
36
37 printf("%d\n", bst);
38 for (i = bst; i; --i)
39 printf("%d ", sir[i]);
40
41 return 0;
42 }

Cel mai lung subsir comun

Fie v un vector cu N elemente. Se numeste subsir de lungime K al vectorului v un nou vector v' = (vi1, vi2, ... viK), cu i1 < i2 < ... < iK. De exemplu, vectorul v = (5 7 8 9

1 6) contine ca subsir sirurile (5 8 6) sau (7 8 1), dar nu contine subsirul (1 5). Se dau doi vectori A si B cu elemente numere naturale nenule.
Cerinta

Sa se determine subsirul de lungime maxima care apare atat in A cat si in B.


Date de intrare

Fisierul de intrare cmlsc.in contine pe prima linie M si N, numarul de elemente pentru vectorul A, respectiv pentru B. A doua linie contine M numere naturale, elementele

vectorului A. A treia linie contine descrierea vectorului B sub acelasi format.


Date de iesire

Fisierul de iesire cmlsc.out va contine pe prima linie MAX, lungimea maxima a unui subsir comun. A doua linie va contine MAX numere ce reprezinta un subsir comun

pentru Asi B. Daca exista mai multe solutii se poate afisa oricare.
Restrictii

 1 ≤ M, N ≤ 1024

 Numerele din cei doi vectori nu depasesc 256


Exemplu

cmlsc.in cmlsc.out

5 3 2

1 7 3 9 8 7 8

7 5 8
#include <stdio.h> if (nivel == M+1) int i;
{
#define NMax 260 if (subsir(len)) // daca sir este subsir si freopen("cmlsc.in", "r", stdin);
pentru B freopen("cmlsc.out", "w", stdout);
int M, N, A[NMax], B[NMax], sir[NMax], bst, if (len > bst)
sol[NMax]; { scanf("%d %d", &M, &N);
bst = len; for (i = 1; i <= M; i++)
int subsir(int nr) // daca sir[1..nr] este subsir for (i = 1; i <= bst; i++) scanf("%d", &A[i]);
pentru B[1..N] sol[i] = sir[i]; for (i = 1; i <= N; i++)
{ } scanf("%d", &B[i]);
int i, j = 1;
return ; back(1, 0);
for (i = 1; i <= nr && j <= N; i++) }
for (; j <= N && B[j] != sir[i]; ++j); printf("%d\n", bst);
return j <= N; // nu folosim A[nivel] for (i = 1; i < bst; i++)
} back(nivel+1, len); printf("%d ", sol[i]);
// folosim A[nivel] in solutie printf("%d\n", sol[bst]);
void back(int nivel, int len) sir[len+1] = A[nivel]; back(nivel+1, len+1);
{ } return 0;
int i; }
int main(void)
{

S-ar putea să vă placă și