标签:int s2 s1 char 序列 strlen 最长 dp
非常经典的一道题
设dp[i][j]为最长公共子序列
i:s1以i为结尾的字符串 j:s2以i为结尾的字符串
则有
无后效性:i+1与j+1 不会影响之前的
子问题重叠:使用i-1, j-1 来代表已经对的结果
最优子结构:dp[i][j] = s[i-1] == s[j-1] ? dp[i-1][j-1] + 1 : max(dp[i-1][j],dp[i][j-1]);
附 http://poj.org/problem?id=1458 ac答案
int calc(const char* s1,const char* s2){
int l1 = strlen(s1);
int l2 = strlen(s2);
vector<vector<int>> dp(l1+1,vector<int>(l2+1));
for( int i=1;i<=l1;i++ ){
for( int j=1;j<=l2;++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]);
}
}
}
return dp[l1][l2];
}
int main(){
string s1,s2;
while(cin >> s1 >> s2){
cout << calc(s1.c_str(),s2.c_str()) << "\n";
}
return 0;
}
标签:int,s2,s1,char,序列,strlen,最长,dp 来源: https://www.cnblogs.com/kingbuffalo/p/16228368.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。