标签:
题意:给两个字符串,求这两个字符串的最长公共子序列的长度
因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊```
解法就是通过两个字符串的每个字符互相比较,根据比较情况相同与否确定递推关系:
dp [ i + 1 ] [ j + 1 ] 表示匹配到 a 字符串的第 i 个字符和 b 字符串的第 j 个字符时的最大匹配数,由于读字符串的时候我是从下标 0 读起的,但我需要用 dp [ 0 ] ,所以就都是加了一,否则也可以读入的时候直接从 a + 1 和 b + 1 读起。
当匹配到 a [ i ] 与 b [ j ] 时,若相等,则 dp [ i + 1 ] [ j + 1 ] = dp [ i ] [ j ] +1,即在匹配完 a [ i - 1 ] 和 b [ j - 1 ] 时的最大值再加上 1 组匹配;
若不相等,则 dp [ i + 1 ] [ j + 1 ] = max ( dp [ i + 1 ] [ j ] , dp [ i ] [ j + 1 ] )。
这样 dp 到最后就得出了结果。
1 #include<stdio.h>
2 #include<string.h>
3 #define max(a,b) a>b?a:b
4
5 char a[1000],b[1000];
6 int dp[1000][1000];
7
8 int main(){
9 while(scanf("%s%s",a,b)!=EOF){
10 memset(dp,0,sizeof(dp));
11 // printf("%s\n%s\n",a,b);
12 int l1=strlen(a),l2=strlen(b),i,j;
13 for(i=0;i<l1;i++){
14 for(j=0;j<l2;j++){
15 if(a[i]==b[j]){
16 dp[i+1][j+1]=dp[i][j]+1;
17 }
18 else{
19 dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
20 }
21 }
22 }
23 /* for(i=0;i<=l1;i++){
24 for(j=0;j<=l2;j++){
25 printf("dp[%d][%d]=%d\n",i,j,dp[i][j]);
26 }
27 }*/
28 printf("%d\n",dp[l1][l2]);
29 }
30 return 0;
31 }
标签:
原文地址:http://www.cnblogs.com/cenariusxz/p/4290211.html