poj 1458 最长公共子序列
题意
两个字符串,求最长的公共子序列的长度
题解
基础的DP方法,dp[i][]j 。i 表示字符串S1的i个字符,j表示字符串s2的第j个字符,最长的公共子序列
状态转移方程为
IfA[i]==B[j]
dp[i][j]= dp[i-1][j-1]+1
else
dp[i][j]= max( dp[i-1][j] , dp[i][j-1] )
AC代码
#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include <set>
#define ll long long
using namespace std;
int dp[1010][1010];
char s1[1010];
char s2[1010];
int main()
{
while(cin>>s1>>s2)
{
int n=strlen(s1);
int m=strlen(s2);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;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]);
}
}
cout<<dp[n][m]<<endl;
}
return 0;
}
本文详细解析了POJ1458题目的解题思路,通过动态规划方法求解两个字符串的最长公共子序列长度。介绍了状态转移方程,并提供了完整的AC代码实现。
1537

被折叠的 条评论
为什么被折叠?



