NYOJ 36 最长公共子序列
地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=36
思路:
dp[i][j]表示 s1 以 i 结尾和 s2 以 j 结尾的最长公共子序列长度;
if(i==0||j==0) dp[i][j]=0 ;
if(s1[i]==s2[j])
dp[i][j]=dp[i-1][j-1]+1
else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
代码如下:
1 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 int dp[1010][1010]; 6 char s1[1010],s2[1010]; 7 int main() 8 { 9 10 int n,i,j,len1,len2; 11 scanf("%d",&n); 12 while(n--) 13 { 14 scanf("%s%s",s1,s2); 15 len1=strlen(s1); 16 len2=strlen(s2); 17 for(i=0;i<=len1;i++) dp[i][0]=0; 18 for(i=0;i<=len2;i++) dp[0][i]=0; 19 for(i=1;i<=len1;i++) 20 { 21 for(j=1;j<=len2;j++) 22 { 23 if(s1[i-1]==s2[j-1]) 24 { 25 dp[i][j]=dp[i-1][j-1]+1; 26 } 27 else dp[i][j]=dp[i][j-1]>dp[i-1][j]?dp[i][j-1]:dp[i-1][j]; 28 } 29 } 30 printf("%d\n",dp[len1][len2]); 31 } 32 //system("pause"); 33 return 0; 34 } 35
这道题快崩溃了。。。。。。