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         

这道题快崩溃了。。。。。。

posted on 2012-08-17 17:56  mycapple  阅读(255)  评论(0编辑  收藏  举报

导航