- 这是最长公共子序列长度的dp解法,注意输入格式问题,可以根据具体情况修改。(gets接收空格,scanf放弃空格)
#include <bits/stdc++.h>
using namespace std;
char A[100],B[100];
int dp[100][100];
int main()
{
gets(A+1);gets(B+1);
int lenA = strlen(A+1),lenB = strlen(B+1);
for(int i=0;i<=lenA;++i) dp[i][0]=0;
for(int i=0;i<=lenB;++i) dp[0][i]=0;
for(int i=1;i<=lenA;++i)
for(int j=1;j<=lenB;++j){
if(A[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]);
}
printf("%d\n",dp[lenA][lenB]);
return 0;
}
- 最长公共子串长度,将上面的 dp[i][j]=max(dp[i-1][j],dp[i][j-1])修改成=0,然后从dp数组中解出最大值输出即可。
#include <bits/stdc++.h>
using namespace std;
char A[100],B[100];
int dp[100][100];
int main()
{
gets(A+1);gets(B+1);
int lenA = strlen(A+1),lenB = strlen(B+1);
for(int i=0;i<=lenA;++i) dp[i][0]=0;
for(int i=0;i<=lenB;++i) dp[0][i]=0;
int n=0;
for(int i=1;i<=lenA;++i)
for(int j=1;j<=lenB;++j){
if(A[i]==B[j])
{dp[i][j]=dp[i-1][j-1]+1;if(dp[i][j]>n) n=dp[i][j];}
else
dp[i][j]=0;
}
printf("%d\n",n);
return 0;
}