MOOC清华《程序设计基础》第6章:最长公共子序列问题(动态规划)

#include 
#include 
using namespace std;

int M = 100;
int N = 100;

int main()
{
	int lcs[M][N];  //M、N足够大 
	int decision[M][N];
	enum
	{
		I_J,  //1+lcs[i+1][j+1],注意是逗号,不是分号 
		I_1,  //lcs[i+1][j],注意是逗号,不是分号 
		J_1  //lcs[i][j+1],注意这里没有逗号也没有分号 
	};  //注意这里有分号 
	char A[M];
	char B[N];
	cin >> A;
	cin >> B;
	int m = strlen(A);  //strlen要求的参数是char*类型的,不能直接定义string A; 
	int n = strlen(B);
	//设定递推初值
	for(int j = 0; j < n + 1; j++)
		lcs[m][j] = 0;  //lcs[m][?] = 0
	for(int i = 0; i < m + 1; i++)
		lcs[i][n] = 0;  //lcs[?][n] = 0
	//递推
	for(int i = m - 1; i >= 0; i--)
		for(int j = n - 1; j >= 0; j--)
			if(A[i] == B[j])
			{
				lcs[i][j] = 1 + lcs[i + 1][j + 1];
				decision[i][j] = I_J;
			} 
			else if(lcs[i][j + 1] < lcs[i + 1][j])
			{
				lcs[i][j] = lcs[i + 1][j];
				decision[i][j] = I_1;
			}
			else
			{
				lcs[i][j] = lcs[i][j + 1];
				decision[i][j] = J_1;
			}
	//输出
	for(int i = 0, j = 0; i < m && j < n;  )
		switch(decision[i][j])
		{
			case I_J:
				cout << A[i];
				i++;
				j++;
				break;
			case I_1:
				i++;
				break;
			case J_1:
				j++;
				break;
		} 
	return 0;
}
MOOC清华《程序设计基础》第6章:最长公共子序列问题(动态规划)_第1张图片


你可能感兴趣的:(C/C++,MOOC清华程设基础)