longest common subsequence

알고2 2014. 12. 3. 11:22

<input>

m n

a

b


54 98 

bnbaqclwzrfkbskuwydbufxlagfgzmfwysjigulxraxrbxwnazupop 

bsxicfbinhukhpunbcqnabqwbrnndwdgiwiskjbumjbwllcdddlleszybrrcntaecwtgcedpnapadfasxfnayogugndwyksije



<output>

22

bnbaqwrkbuwydfxaggwys



#include <stdio.h>

#include <stdlib.h>

#include <math.h>


#define left 1

#define up 2

#define dagak 3


char a[1000];

char b[1000];


int c[100][100];

int dir[100][100];

int n,m;

void printlcs(int dir[100][100], char* a, int i,int j)

{

if (i==0 || j==0)

return;

if (dir[i][j] == dagak)

{

printlcs(dir,a,i-1,j-1);

printf ("%c",a[i]);

}

else if (dir[i][j] == up)

{

printlcs(dir,a,i-1,j);

}

else if (dir[i][j] == left)

{

printlcs(dir,a,i,j-1);

}

}

int main(void)

{

int i,j;

int logn;

// n

// nxn matrix

FILE* f = fopen ("input2.txt","r");

fscanf (f,"%d %d\n",&m,&n);


fgets(a+1,sizeof(a),f);

fgets(b+1,sizeof(b),f);


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 (a[i] == b[j])

{

c[i][j] = c[i-1][j-1] + 1;

dir[i][j] = dagak;

}

else if (c[i-1][j] >= c[i][j-1])

{

c[i][j] = c[i-1][j];

dir[i][j] = up;

}

else

{

c[i][j] = c[i][j-1];

dir[i][j] = left;

}

}

}

printf ("%d\n",c[m][n]);

printlcs(dir,a,m,n);

printf ("\n");


}

'알고2' 카테고리의 다른 글

Parallel Sorting  (0) 2014.12.03
bin packing2  (0) 2014.11.26
bin packing (first fit) winner tree  (0) 2014.11.19
가장 높은탑 쌓기  (0) 2014.11.12
topological sort + bellman  (0) 2014.11.12
Posted by rjh
,