正确版:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<string>
 4 using namespace std;
 5 const int MAXN=205;
 6 int dp[MAXN][MAXN];
 7 int main()
 8 {
 9     string line,x,y;
10     while(cin>>x>>y)
11     {
12         
13         int lx=x.length();
14         int ly=y.length();
15 
16         //初始化 
17         memset(dp,0,sizeof(dp));
18         for(int i=1;i<=lx;i++)
19         {
20             for(int j=1;j<=ly;j++)
21             {
22                 if(x[i-1]==y[j-1])
23                 {
24                     dp[i][j]=dp[i-1][j-1]+1;
25                 }
26                 else
27                 {
28                     dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
29                 }
30             }
31         }
32             
33         cout<<dp[lx][ly]<<endl;  
34     }
35     return 0;
36 }

 

自己开始写的错误版本:

 1 /*
 2 报错:runtime err  但是不知道为什么,把15-24行代码改成“while(cin>>x>>y)”就是对的
 3 改进:边界的那两个地方的可以不用单独拎出来做,直接写进循环里面是可以的。只不过此时dp[i][j]的下标表示的
 4 是两个序列的长度。 
 5 */ 
 6 #include<iostream>
 7 #include<cstring>
 8 #include<string>
 9 using namespace std;
10 const int MAXN=205;
11 int dp[MAXN][MAXN];
12 int main()
13 {
14     string line,x,y;
15     while(getline(cin,line))//输入这边不一样,就要加上判断长度是否为0了,不然还会一直输出的 
16     {
17         if(line.length()==0)
18             continue;
19         int p=line.find(" ");
20         string x=line.substr(0,p);
21 //        p=line.find_last_of(" ");//这句话是错的,因为有可能第二个字符串中间是带' '的! 
22         while(line[p]==' ')
23             p++;
24         string y=line.substr(p,line.length()-p);
25         
26         
27         int lx=x.length();
28         int ly=y.length();
29 
30         //初始化 
31         memset(dp,0,sizeof(dp));
32         if((p=x.find(y[0]))!=string::npos)
33         {
34             for(int i=p;i<lx;i++)
35             {
36                 dp[i][0]=1;
37             }
38         }
39         if((p=y.find(x[0]))!=string::npos)
40         {
41             for(int i=p;i<ly;i++)
42                 dp[0][i]=1;
43         }
44 
45         //一般递推
46         for(int i=1;i<lx;i++)
47         {
48             for(int j=1;j<ly;j++)
49             {
50                 if(x[i]==y[j])
51                 {
52                     dp[i][j]=dp[i-1][j-1]+1;
53                 }
54                 else
55                 {
56                     dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
57                 }
58             }
59         }
60              
61         cout<<dp[lx-1][ly-1]<<endl; 
62     }
63     return 0;
64 }

 

 posted on 2019-03-29 20:04  Goven  阅读(98)  评论(0)    收藏  举报