hdu1159 dp(最长公共子序列)

题意:给两个字符串,求这两个字符串的最长公共子序列的长度

因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊```

解法就是通过两个字符串的每个字符互相比较,根据比较情况相同与否确定递推关系:

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
%s
",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
",i,j,dp[i][j]);
26             }
27         }*/
28         printf("%d
",dp[l1][l2]);
29     }
30     return 0;
31 }
View Code

 

原文地址:https://www.cnblogs.com/cenariusxz/p/4290211.html