题目链接:点击打开链接
求最长公共子串的长度模板
char s1[maxn],s2[maxn];
int dp[maxn][maxn];
//求串s1和串s2的公共子序列
int lcs(char *s1,char *s2)
{
int len1 = strlen(s1);
int len2 = strlen(s2);
for(int i = 0; i <= len1; ++i)
{
for(int j = 0; j <= len2; ++j)
{
if(i == 0 || j == 0)
dp[i][j] = 0;
else 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]);
}
}
return dp[len1][len2];
}
这里只要把权值该了就好了,给的数组大小有点坑
看代码:
#include <iostream>
#include <algorithm>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
const int maxn=2e3+10;
char key[maxn];
int val[maxn],cunt,n;
char s1[maxn],s2[maxn];
int dp[maxn][maxn];
//求串s1和串s2的公共子序列
int lcs(char *s1,char *s2)
{
memset(dp,0,sizeof(dp));
int len1 = strlen(s1);
int len2 = strlen(s2);
for(int i = 0; i <= len1; ++i)
{
for(int j = 0; j <= len2; ++j)
{
if(i == 0 || j == 0)
dp[i][j] = 0;
else if(s1[i-1] == s2[j-1])
dp[i][j] = dp[i-1][j-1] + val[s1[i-1]];
else
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[len1][len2];
}
int main()
{
int n,i,j;
while(~scanf("%d",&n))
{
scanf("%s",key);
for(i=0;i<n;i++)
scanf("%d",&val[key[i]]);
scanf("%s %s",s1,s2);
printf("%d\n",lcs(s1,s2));
}
return 0;
}