题目链接:
http://codeforces.com/problemset/problem/682/D
题意:
给你两串字符串,让你找出这两串字符串K个公共子串,要求的是其顺序不发生改变并且它的和要求最大。
题解:
当k为1的时候,我们不难想到这是一个LCS,但是不同的地方在于它不是1个,而是多个。所以,我们很容易想到在LCS的基础上加一纬K来进行思考,但是在具体实现的时候会发现不够,需要再开一纬判断是不是在当前的串中。
代码:
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int maxn = 1000+10;
int dp[maxn][maxn][10][2];
char s1[maxn],s2[maxn];
int main()
{
int n,m,k;
cin>>n>>m>>k;
cin>>(s1+1)>>(s2+1);
met(dp,0);
int len1=strlen(s1+1);
int len2=strlen(s2+1);
// dp[0][0][0][0]=dp[0][0][0][1]=1;
for(int q=1;q<=k;q++)
{
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(s1[i]==s2[j])
{
dp[i][j][q][1]=max(dp[i-1][j-1][q-1][0]+1,dp[i-1][j-1][q-1][1]+1);
dp[i][j][q][1]=max(dp[i][j][q][1],dp[i-1][j-1][q][1]+1);
}
dp[i][j][q][0]=max(dp[i-1][j][q][0],dp[i][j-1][q][0]);
dp[i][j][q][0]=max(dp[i][j][q][0],dp[i-1][j][q][1]);
dp[i][j][q][0]=max(dp[i][j][q][0],dp[i][j-1][q][1]);
// printf("%d\n",dp[i][j][q][1]);
}
}
}
printf("%d\n",max(dp[len1][len2][k][1],dp[len1][len2][k][0]));
}