Dp 基础 最长公共子
2017-08-27 16:19
134 查看
最长公共子序列是一个最基础的Dp,要想搞懂他可以手动模拟一下,很有效。
下面用一个maxlen的二维数组来记录我们的比较情况, maxlen[i][j]记录的就是两个字符串 s1的前 i个字符与s2前 j 个字符的最长公共子序列;
下面介绍下最重要的两个步骤:
if(s1[i] == s2[j])
maxlen[i][j] = maxlen[i-1][j-1] + 1;
这个步骤的意思如果字符串s1的第 i 个字符与 s2 的第 j 个字符相同,那么字符串 s1的前 i个字符与s2前 j 个字符的最长公共子序列就应该是字符串 s1的前 i-1 个字符与s2前 j -1 个字符的最长公共子序列 .
else
maxlen[i][j] = max(maxlen[i][j-1],maxlen[i-1][j]);
这个步骤的意思如果字符串s1的第 i 个字符与 s2 的第 j 个字符不相同,那么字符串 s1的前 i个字符与s2前 j 个字符的最长公共子序列就应该是字符串s1的前 i-1 个字符与s2前 j 个字符的最长公共子序列 和 字符串s1的前 i个字符与s2前 j -1 个字符的最长公共子序列的最大值
如果还不懂,请手动模拟两个短的字符串,代码如下:
下面用一个maxlen的二维数组来记录我们的比较情况, maxlen[i][j]记录的就是两个字符串 s1的前 i个字符与s2前 j 个字符的最长公共子序列;
下面介绍下最重要的两个步骤:
if(s1[i] == s2[j])
maxlen[i][j] = maxlen[i-1][j-1] + 1;
这个步骤的意思如果字符串s1的第 i 个字符与 s2 的第 j 个字符相同,那么字符串 s1的前 i个字符与s2前 j 个字符的最长公共子序列就应该是字符串 s1的前 i-1 个字符与s2前 j -1 个字符的最长公共子序列 .
else
maxlen[i][j] = max(maxlen[i][j-1],maxlen[i-1][j]);
这个步骤的意思如果字符串s1的第 i 个字符与 s2 的第 j 个字符不相同,那么字符串 s1的前 i个字符与s2前 j 个字符的最长公共子序列就应该是字符串s1的前 i-1 个字符与s2前 j 个字符的最长公共子序列 和 字符串s1的前 i个字符与s2前 j -1 个字符的最长公共子序列的最大值
如果还不懂,请手动模拟两个短的字符串,代码如下:
#include<stdio.h> #include<string.h> using namespace std; const int N = 1000; char s1 , s2 ; //两个字符串 int maxlen ; int max(int a,int b) { if(a>b) return a; return b; } int main() { scanf("%s %s",s1+1,s2+1); // 输入字符串,下标从 1 开始 int i, j, len1, len2; len1 = strlen(s1+1); // s1 的长度 len2 = strlen(s2+1);// s2 的长度 memset(maxlen,0,sizeof(maxlen)); for(i=1;i<=len1;i++) for(j=1;j<=len2;j++) { if(s1[i] == s2[j]) maxlen[i][j] = maxlen[i-1][j-1] + 1; else maxlen[i][j] = max(maxlen[i][j-1],maxlen[i-1][j]); } printf("%d\n",maxlen[len1][len2]); return 0; }
相关文章推荐
- 最长公共字符串 基础DP
- java_基础知识_字符串练习题_计算两个字符串的最长公共字串长度
- 最长公共子序列与最长公共子串(DP)
- poj1458(DP最长连续公共子序列)
- hdu 1159(DP+字符串最长公共序列)
- poj 2127 dp(最长公共递增子序列)
- (Relax DP1.5)POJ 1458 Common Subsequence(使用dp来求解最长公共子串)
- ju 2432Greatest Common Increasing Subsequence 最长公共上升子串-dp
- DP(最长公共子串问题)
- 最长公共上升子序列的DP解法及其优化
- History Grading dp+求最长公共子串
- dp最长公共子串LCS
- 最长公共上升子序列的DP解法及其优化
- Is Bigger Smarter?+uva+简单dp(最长公共升降子序列的变形)
- 求两个字符串的最长公共子串(DP实现)
- 【HDU1080 DP】类似最长公共子串
- hdu 1423 Greatest Common Increasing Subsequence(DP 最长公共上升子序列)
- code 2185 最长公共上升子序列 (dp)
- CSU 1120 病毒(dp最长公共序列)
- hdu 1423 Greatest Common Increasing Subsequence(DP 最长公共上升子序列)