正确版:
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
浙公网安备 33010602011771号