侧边栏

HDU-1159 Common Subsequence

链接http://acm.hdu.edu.cn/showproblem.php?pid=1159

题意:多组输入,每组两个字符串,求最长公共子序列(LCS)的长度

思路:裸题,套板子。dp[i][j]表示a串以i结尾,b串以j结尾的范围中,LCS的长度,如果a[i]=b[j],那么dp[i][j]=dp[i-1][j-1]+1,不然就从dp[i-1][j]和dp[i][j-1]里挑一个最大的,遍历i和j跑一遍最后输出dp[n][m]就好了

代码

 1 #include<bits/stdc++.h>
 2 // #include<iostream>
 3 // #include<cstdio>
 4 // #include<cmath>
 5 #define inf 0x3f3f3f3f
 6 using namespace std;
 7 
 8 typedef long long ll;
 9 typedef long double ld;
10 
11 const int M = int(1e5)*3 + 5;
12 const int mod = 10056;
13 
14 inline int lowbit(int x) {
15     return x & (-x);
16 }
17 
18 // string a,b;
19 char a[M],b[M];
20 int dp[1005][1005];
21 int main(){
22     while(~scanf("%s%s",a+1,b+1)){
23         memset(dp,0,sizeof(dp));
24     
25         int n=strlen(a+1);
26         int m=strlen(b+1);
27         
28         for(int i=1;i<=n;i++){
29             for(int j=1;j<=m;j++){
30                 if(a[i]==b[j]){
31                     dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
32                 }
33                 else{
34                     dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
35                 }
36             }
37         }
38         
39         cout<<dp[n][m]<<endl;
40     }
41     // scanf("%s",a+1);
42     // int n=strlen(a+1);
43     // printf("%d",n);
44     return 0;
45 }

备注:想用string写,但是边界问题处理不好,有没有大神能用string写一下的

posted @ 2019-08-02 11:10  晴人  阅读(89)  评论(0编辑  收藏  举报