#include "stdio.h"
#include "stdlib.h"
int DPFindCommon(int x[], int y[], int m, int n, int **b);
void displayZ(int x[], int m, int n, int **b);
int main()
{
int i, m, n, j, q;
scanf("%d", &m);
scanf("%d", &n);
int **b = (int **)malloc(sizeof(int *) * (m + 1));
for(i = 0; i <= m; i++)
{
b[i] = (int *)malloc(sizeof(int) * (n + 1));
}
for(i = 0; i <= m; i++)
{
for(j = 0; j <= n; j++)
{
b[i][j] = 2;
}
}
int *x = (int *)malloc(sizeof(int) * m);
int *y = (int *)malloc(sizeof(int) * n);
printf("input x:");
for(i = 1; i <= m; i++)
{
scanf("%d", &x[i]);
}
printf("input y:");
for(i = 1; i <= n; i++)
{
scanf("%d", &y[i]);
}
q = DPFindCommon(x, y, m, n, b);
printf("len:%d\n", q);
displayZ(x, m, n, b);
return 0;
}
int DPFindCommon(int x[], int y[], int m, int n, int **b)
{
int i, j;
int **c = (int **)malloc(sizeof(int *) * (m + 1));
for(i = 0; i <= m; i++)
{
c[i] = (int *)malloc(sizeof(int) * (n + 1));
}
for(i = 0; i <= m; i++)
{
c[i][0] = 0;
}
for(i = 0; i <= n; i++)
{
c[0][i] = 0;
}
for(i = 1; i <= m; i++)
{
for(j = 1; j <= n; j++)
{
if(x[i] == y[j])
{
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 1;
}
else if(c[i][j - 1] > c[i - 1][j])
{
c[i][j] = c[i][j - 1];
b[i][j] = -1;
}
else
{
c[i][j] = c[i-1][j];
b[i][j] = 0;
}
//printf("(i: %d, j:%d, b[i][j]:%d) \n",i, j, b[i][j]);
}
}
return c[m][n];
}
void displayZ(int x[], int m, int n, int **b)
{
int i = 1, j = 1, k;
while(i <= m && j <= n)
{
//printf("(i: %d, j:%d, b[i][j]:%d)",i, j, b[i][j]);
if(b[i][j] == 1)
{
printf("%d\t", x[i]);
i++;
j++;
}
else if(b[i][j] == -1)
{
j++;
}
else
{
i++;
}
}
printf("\n");
}
#include "stdlib.h"
int DPFindCommon(int x[], int y[], int m, int n, int **b);
void displayZ(int x[], int m, int n, int **b);
int main()
{
int i, m, n, j, q;
scanf("%d", &m);
scanf("%d", &n);
int **b = (int **)malloc(sizeof(int *) * (m + 1));
for(i = 0; i <= m; i++)
{
b[i] = (int *)malloc(sizeof(int) * (n + 1));
}
for(i = 0; i <= m; i++)
{
for(j = 0; j <= n; j++)
{
b[i][j] = 2;
}
}
int *x = (int *)malloc(sizeof(int) * m);
int *y = (int *)malloc(sizeof(int) * n);
printf("input x:");
for(i = 1; i <= m; i++)
{
scanf("%d", &x[i]);
}
printf("input y:");
for(i = 1; i <= n; i++)
{
scanf("%d", &y[i]);
}
q = DPFindCommon(x, y, m, n, b);
printf("len:%d\n", q);
displayZ(x, m, n, b);
return 0;
}
int DPFindCommon(int x[], int y[], int m, int n, int **b)
{
int i, j;
int **c = (int **)malloc(sizeof(int *) * (m + 1));
for(i = 0; i <= m; i++)
{
c[i] = (int *)malloc(sizeof(int) * (n + 1));
}
for(i = 0; i <= m; i++)
{
c[i][0] = 0;
}
for(i = 0; i <= n; i++)
{
c[0][i] = 0;
}
for(i = 1; i <= m; i++)
{
for(j = 1; j <= n; j++)
{
if(x[i] == y[j])
{
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 1;
}
else if(c[i][j - 1] > c[i - 1][j])
{
c[i][j] = c[i][j - 1];
b[i][j] = -1;
}
else
{
c[i][j] = c[i-1][j];
b[i][j] = 0;
}
//printf("(i: %d, j:%d, b[i][j]:%d) \n",i, j, b[i][j]);
}
}
return c[m][n];
}
void displayZ(int x[], int m, int n, int **b)
{
int i = 1, j = 1, k;
while(i <= m && j <= n)
{
//printf("(i: %d, j:%d, b[i][j]:%d)",i, j, b[i][j]);
if(b[i][j] == 1)
{
printf("%d\t", x[i]);
i++;
j++;
}
else if(b[i][j] == -1)
{
j++;
}
else
{
i++;
}
}
printf("\n");
}