最长公共子序列问题—水水的Dp

1030: 苦恼的月下老人

Description

    传说中,月老是掌管男女婚姻之神。每年七夕,七星娘娘会把人世间未婚的成年男女制成名册,向天庭呈报。月下老人收到名册后,按照个性、善恶、兴趣与条件抄写成一本配偶名册,然后用红线绑牢男女二人之足,使合适的男女配成一对佳偶。
    在一个古老的小镇,有一条古老的小河横穿这个镇南北,把这个小镇划分成东西两个部分。这个古老的小镇保留着一个古老的风俗,所有未婚男子都住在这条河的西岸上面,所有的未婚女子都住在这条河的东岸。
    今年月下老人收到了这个小镇上所有未婚男女的名册,他把每个人的个性、善恶、兴趣与条件做了一个简单的汇总,给每个人添加了一个如A B C之类的标签,只有相同标签的男女才有可能用红线绑在一起。原本这个是个很简单的事情,但是现在问题是月老使用的红线,是不能互相交叉的,否则后果会很严重。所以月老为了更多人的幸福,他只能牺牲部分人的幸福。现在月老在纸上笔划了很久,还是没能比划出一个最好的方案,使得让最多对情侣终成眷属。您能帮帮他么?

Input

    输入的文件的第一行包含两个整数N,M(0<N, M <= 1000),分别表示未婚男子和未婚女子的数目。
    第二行包含一个长度为N的字符串,字符串为大写字母A-Z和小写字母a-z组成,从北到南顺序表示每个男子的标签。
    第三行包含一个长度为M的字符串,从北到南顺序顺序表示每个女子的标签。

Output

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

Sample Input

5 4

ABACB

CBAB

Sample Output

3

HINT

样例中月老可以给第2个男子和第2个女子、第3个男子和第3个女子、第5个男子和第4个女子牵线。第4个男子和第1个女子虽然是一样的标签,但是会和其他人的红线相交叉,所以只好“牺牲”他们的幸福。

Source

xmu



就是求一个裸的最长公共子序列问题:如果A[i]==B[j],dp[i][j]=dp[i-1][j-1]+1,否则:dp[i][j]=max(dp[i-1][j],dp[i][j-1])。


代码:

#include<bits/stdc++.h>
#define maxn 1010

using namespace std;

int dp[maxn][maxn];
char A[maxn],B[maxn];

int main(){
    int N,M;
    while(cin>>N>>M){
        for(int i=1;i<=N;i++) cin>>A[i];
        for(int i=1;i<=M;i++) cin>>B[i];
        dp[0][0]=dp[1][0]=dp[0][1]=0;
        int ans=0;
        for(int i=1;i<=N;i++) for(int j=1;j<=M;j++){
            if(A[i]==B[j]) dp[i][j]=dp[i-1][j-1]+1;
            else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            ans=max(ans,dp[i][j]);
        }
        printf("%d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值