HDU 1159 Common Subsequence
2013-07-28 16:49
369 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1159
思路来源于同学的讲解。。解题思路:我们从字符串的最后一个字符开始讨论。设两个字符串的长度分别为m、n.如果最后一个字符串相等,那么字符串的最长公共子序列必然在m-1和n-1的剩余子串中产生。所以我们有:
dp[i][j]=dp[i-1][j-1]+1;
如果最后一个字符是不相同的,那么可以分两种情况考虑。
(1)最长公共子序列从m-1中产生。则有:
dp[i][j]=dp[i-1][j];
(2) 最长公共子序列从n-1中产生。则有:
dp[i][j]=dp[i][j-1];
综上可得状态转移方程:
dp[i][j]=dp[i-1][j-1]+1 (x[i]==y[j])
dp[i][j]=max(dp[i-1][j],dp[i][j-1]) (x[i]!=y[j])
由上述我们可得下图:
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char a[2010],b[2010];
int dp[2010][2010];
int lcs(int n,int m)
{
int i,j;
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
if(a[i-1] == b[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
[m];
}
int main()
{
int n,m,maxx;
while(scanf("%s%s",&a,&b)!=EOF)
{
memset(dp,0,sizeof(dp));
n = strlen(a);
m = strlen(b);
maxx = lcs(n,m);
printf("%d\n",lcs(n,m));
}
return 0;
}
相关文章推荐
- hdu【1159】Common Subsequence 【最长公共子序列】
- [HDU - 1159] Common Subsequence(动态规划&&LCS)
- hdu 1159 Common Subsequence(最长公共子序列)
- HDU-1159 Common Subsequence 最长上升子序列
- HDU 1159 Common Subsequence(最长公共子序列)
- 最长公共子序列DP Common Subsequence HDU 1159
- hdu 1159 Common Subsequence
- HDU 1159-Common Subsequence(LCS 最长公共子序列)
- HDU-1159 Common Subsequence 最长上升子序列
- hdu1159 Common Subsequence
- hdu 1159 Common Subsequence(DP最长公共子序列)
- HDU1159,Common Subsequence,toCharArray()
- HDU 1159 Common Subsequence(dp最大公共子串)
- hdu 1159 Common Subsequence 【LCS 基础入门】
- HDU 1159 Common Subsequence 最长公共子序列
- HDU 1159:Common Subsequence(最长公共子序列)
- HDU-1159 Common Subsequence(动态规划)
- HDU 1159 Common Subsequence(LCS)
- hdu1159 Common Subsequence
- hdu 1159 Common Subsequence(DP最长公共子序列)