题目传送门http://acm.hdu.edu.cn/showproblem.php?pid=1159
题意:寻找最长的 共同子序列 自学列 的顺序要求一致 但是和最长 字符串不同 这些字符没有必要挨着
比如 题目中的样例1 abcfbc abfcab 这两个 字符串 最长的 公共子序列是 abc 而最长公共字符串是ab
知道题意就能做了 用动态规划 一步步的 推,废话不说了 放代码
顺便 给大家推荐一个 动态规划 比较好的连接 个人看了这个 感觉写的蛮好的 http://blog.csdn.net/lyhvoyage/article/details/8545852
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char str1[2000],str2[2000];
int dp[2000][2000],len1,len2;
void ys()
{
int i,j;
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
{
if(str1[i]==str2[j])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
}
}
int main()
{
while(~scanf("%s%s",str1+1,str2+1)) //str+1 的意思是从字符串str的str[1]开始存储 因为 用dp的二维数组 方便运算就这样输入了
{
memset(dp,0,sizeof(dp));
len1=strlen(str1+1);
len2=strlen(str2+1);
ys();
printf("%d\n",dp[len1][len2]);
}
return 0;
}