动规,模拟,递推,最长公共子序列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动规,模拟,递推,最长公共子序列相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=1458
解题报告:
1、用二维数组模拟两个字符串上每个子串对应的最长公共子序列。
2、显然,就是要求二维数组最右下的数字
3、递推公式:
if(s1[i-1]==s2[j-1]) maxlen[i][j]=maxlen[i-1][j-1]+1; else maxlen[i][j]=max(maxlen[i][j-1],maxlen[i-1][j]);
Memory: 1024KTime: 0MSLanguage: C++Result: Accepted
#include <iostream> #include <string.h> #include <algorithm> #define MAX 1000 using namespace std; char s1[MAX]; char s2[MAX]; int maxlen[MAX][MAX];///maxlen[i][j]表示s1左边的第i个字符形成的子串,与s2左边的j个字符形成子串,的最长公共子序列的长度 int main() { while(cin>>s1>>s2) { int len1=strlen(s1); int len2=strlen(s2); ///结果就是要求maxlen[len1][len2];这里采用动规的方法递推 int i,j; for(i=0;i<=len1;i++) maxlen[i][0]=0; for(j=0;j<=len2;j++) maxlen[0][j]=0; for(i=1;i<=len1;i++) { for(j=1;j<=len2;j++) { if(s1[i-1]==s2[j-1])///这里从s1的第一个字符开始与s2比较 maxlen[i][j]=maxlen[i-1][j-1]+1; else maxlen[i][j]=max(maxlen[i-1][j],maxlen[i][j-1]); } } cout<<maxlen[len1][len2]<<endl; } return 0; }
以上是关于动规,模拟,递推,最长公共子序列的主要内容,如果未能解决你的问题,请参考以下文章