最长公共子序列问题—水水的Dp
2015-05-24 18:37
260 查看
1030: 苦恼的月下老人
Description
传说中,月老是掌管男女婚姻之神。每年七夕,七星娘娘会把人世间未婚的成年男女制成名册,向天庭呈报。月下老人收到名册后,按照个性、善恶、兴趣与条件抄写成一本配偶名册,然后用红线绑牢男女二人之足,使合适的男女配成一对佳偶。在一个古老的小镇,有一条古老的小河横穿这个镇南北,把这个小镇划分成东西两个部分。这个古老的小镇保留着一个古老的风俗,所有未婚男子都住在这条河的西岸上面,所有的未婚女子都住在这条河的东岸。
今年月下老人收到了这个小镇上所有未婚男女的名册,他把每个人的个性、善恶、兴趣与条件做了一个简单的汇总,给每个人添加了一个如A B C之类的标签,只有相同标签的男女才有可能用红线绑在一起。原本这个是个很简单的事情,但是现在问题是月老使用的红线,是不能互相交叉的,否则后果会很严重。所以月老为了更多人的幸福,他只能牺牲部分人的幸福。现在月老在纸上笔划了很久,还是没能比划出一个最好的方案,使得让最多对情侣终成眷属。您能帮帮他么?
Input
输入的文件的第一行包含两个整数N,M(0<N, M <= 1000),分别表示未婚男子和未婚女子的数目。第二行包含一个长度为N的字符串,字符串为大写字母A-Z和小写字母a-z组成,从北到南顺序表示每个男子的标签。
第三行包含一个长度为M的字符串,从北到南顺序顺序表示每个女子的标签。
Output
输出一个整数表示月老最多可以为多少对情侣成功牵线。Sample Input
5 4ABACB
CBAB
Sample Output
3HINT
样例中月老可以给第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;
}
相关文章推荐
- hdu 1503:Advanced Fruits(动态规划 DP & 最长公共子序列(LCS)问题升级版)
- nyoj 36 最长公共子序列 dp问题最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共
- 最长公共子序列(LCS问题)的DP解法
- 最长公共子序列问题 经典DP
- 最长公共子序列的问题 (DP)
- DP经典应用(三)最长公共子序列LCS问题
- LCS 最长公共子序列(DP经典问题)
- DP复习——最长公共子序列 LCS 问题
- DP---LCS 最长公共子序列问题
- DP---LCS 最长公共子序列问题
- 【dp基础课程】矩阵取数问题+最大子段和+最长公共子序列(LCS)【51nod】
- 算法(DP):最长公共子序列问题
- 最长公共子序列问题(LCS)(DP)
- 基于DP的LCS(最长公共子序列)问题
- 基于DP的LCS(最长公共子序列)问题
- [dp]最长公共子序列问题
- 算法学习之二——用DP和备忘录算法求解最长公共子序列问题
- xynu 问题 G: [动归基础]最长公共子序列( dp )
- DP问题之最长公共子序列
- 公主和王子能在一起多久的问题+dp+最长公共子序列转最长子序列。