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;
}