这很明显就是一道求最长公共子序列的题(甚至没有给任何的陷阱)
对于求最长公共子序列,我们要知道它的算法:
for(int i=1; i<=len_a; i++)
{
for(int j=1; j<=len_b; j++)
{
if(a[i-1]==b[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
dp[i][j]=max(dp[i-1][j], dp[i][j-1]);
}
}
}
但这题还有点要注意的就是,你的i与j最好从1开始,当然不是说你输入时的样式,而是指在上述的算法中的情况下,因为假如i=0或者j=0的时候,dp[i][j]=dp[i-1][j-1]+1 与 dp[i][j]=max(dp[i-1][j] , dp[i][j-1])会存在空情况。
接着,送上完整代码:
#include <iostream> #include <cstdio> #include <string> #include <algorithm> using namespace std; string a,b; int len_a,len_b; int dp[1001][1001]; int main() { while(cin>>a>>b) { memset(dp, 0, sizeof(dp)); len_a=(int)a.length(); len_b=(int)b.length(); for(int i=1; i<=len_a; i++) { for(int j=1; j<=len_b; j++) { if(a[i-1]==b[j-1]) { dp[i][j]=dp[i-1][j-1]+1; } else { dp[i][j]=max(dp[i-1][j], dp[i][j-1]); } } } printf("%d\n",dp[len_a][len_b]); } return 0; }优化:
稍微改进了些小操作,规范一下:
#include <iostream> #include <cstdio> #include <string> #include <algorithm> #define MT(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; string a,b; int dp[1005][1005]; int main() { while(cin>>a>>b) { MT(dp, 0); for(int i=1; i<=a.size(); i++) { for(int j=1; j<=b.size(); j++) { if(a[i-1]==b[j-1]) { dp[i][j]=dp[i-1][j-1]+1; } else { dp[i][j]=max(dp[i-1][j], dp[i][j-1]); } } } printf("%d\n",dp[a.size()][b.size()]); } return 0; }