您的位置:首页 > 其它

动态规划——最长公共子序列

2013-11-15 23:28 302 查看
#include <stdio.h>
#define N 10
void LCSLength(int m, int n, char *x, char *y,int c[]
,int b[]
)
{
	int i, j;
	for(i = 1; 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-1]==y[j-1]) 
			{
				c[i][j] = c[i-1][j-1] + 1;
				b[i][j] = 1;
			}else if(c[i-1][j]>=c[i][j-1]){
				c[i][j] = c[i-1][j];
				b[i][j] = 2;
			}else{
				c[i][j] = c[i][j-1];
				b[i][j] = 3;
			}
		}
}

void LCS(int i, int j, char *x, int b[]
)
{
	if(i==0 || j ==0) return ;
	if(b[i][j]==1){
		LCS(i-1, j-1, x, b);
		printf("%c, ",x[i-1]);
	}else if(b[i][j]==2) LCS(i-1, j, x,b);
	else LCS(i, j-1, x ,b);
}

int main()
{
	char x
={"ABCBDAB"};
	char y
={"BDCABA"};
	int c

, b

;
	int i, j, m, n ;
	m = strlen(x);
	n = strlen(y);
	printf("m  = %d, n = %d\n", m,n);
	LCSLength(m,n, x, y, c, b);
	LCS(m,n,x,b);
	printf("%d\n", c[m]
);
	system("pause");	
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: