您的位置:首页 > 其它

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

2017-07-22 20:58 281 查看
#include <iostream>
#include <cstring>
using namespace std;

int M = 100;
int N = 100;

int main()
{
int lcs[M]
;  //M、N足够大
int decision[M]
;
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
;
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]
= 0;  //lcs[?]
= 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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐