题意:给两个字符串,求这两个字符串的最长公共子序列的长度
因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊```
解法就是通过两个字符串的每个字符互相比较,根据比较情况相同与否确定递推关系:
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 }
时间: 2024-10-13 01:39:12