您的位置:首页 > 其它

最长子序列问题

2017-04-09 19:47 204 查看

题目描述

    传说中,月老是掌管男女婚姻之神。每年七夕,七星娘娘会把人世间未婚的成年男女制成名册,向天庭呈报。月下老人收到名册后,按照个性、善恶、兴趣与条件抄写成一本配偶名册,然后用红线绑牢男女二人之足,使合适的男女配成一对佳偶。

    在一个古老的小镇,有一条古老的小河横穿这个镇南北,把这个小镇划分成东西两个部分。这个古老的小镇保留着一个古老的风俗,所有未婚男子都住在这条河的西岸上面,所有的未婚女子都住在这条河的东岸。

    今年月下老人收到了这个小镇上所有未婚男女的名册,他把每个人的个性、善恶、兴趣与条件做了一个简单的汇总,给每个人添加了一个如A B C之类的标签,只有相同标签的男女才有可能用红线绑在一起。原本这个是个很简单的事情,但是现在问题是月老使用的红线,是不能互相交叉的,否则后果会很严重。所以月老为了更多人的幸福,他只能牺牲部分人的幸福。现在月老在纸上笔划了很久,还是没能比划出一个最好的方案,使得让最多对情侣终成眷属。您能帮帮他么?

输入

    输入的文件的第一行包含两个整数N,M(0<N, M <= 1000),分别表示未婚男子和未婚女子的数目。

    第二行包含一个长度为N的字符串,字符串为大写字母A-Z和小写字母a-z组成,从北到南顺序表示每个男子的标签。

    第三行包含一个长度为M的字符串,从北到南顺序顺序表示每个女子的标签。

输出

    输出一个整数表示月老最多可以为多少对情侣成功牵线。

样例输入

5 4

ABACB

CBAB

样例输出

3

#include
#include
#define  N 1001

int c

;

void DPLCSLength(char s1[], char s2[], int n, int m)
{
int i, j;
for(i=1; i<=n; i++)
c[i][0]=0;
for(j=0; j<=m; j++)
c[0][j]=0;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
if(s1[i-1]==s2[j-1])
c[i][j]=c[i-1][j-1]+1;
else if(c[i-1][j]>=c[i][j-1])
c[i][j]=c[i-1][j];
else
c[i][j]=c[i][j-1];
}

int main()
{
int n,m,i,j;
scanf("%d %d", &n, &m);
getchar();
char s1
,s2
;
gets(s1);gets(s2);
DPLCSLength(s1,s2,n,m);
printf("%d\n", c
[m]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: