题目:POJ1458
思路:用dp[i][j]表示第一个字符串s1的前i个字符组成的子串和第二个字符串s2的前j个字母组成的子串的最长公共子序列长度。
当上一个状态s1[i-1]=s2[j-1]时,dp[i][j]=dp[i-1][j-1]+1;(当前位置对应字符相等,则最长公共子序列等于上一状态的最长公共子序列长度+1);
否则,dp[i][j]=max(dp[i-1][j],dp[i][j-1]);(当前位置对应字符不相等,则最长公共子序列等于上一状态当前第一个字符串遍历到的子串去掉当前字符的子串与当前第二个字符串遍历到的子串的最长公共子序列长度或当前第二个字符串遍历到的子串去掉当前字符的子串与当前第一个字符串遍历到的子串最长公共子序列长度)
完整代码:
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
string s1,s2;
int dp[500][500];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>s1>>s2){
for(int i=1;i<=s1.size();i++){
for(int j=1;j<=s2.size();j++){
if(s1[i-1]==s2[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<dp[s1.size()][s2.size()]<<endl;
}
return 0;
}