String

来源:互联网 发布:java的applet过时了吗 编辑:程序博客网 时间:2024/05/17 04:33

Description

有两种字符串S,T。长度分别为n,m。现在需要在S里面有序地选出k个子串,且在T中出现的顺序与这k个子串的顺序相同。问这k个子串最大的长度和
n,m<=1000,k<=10

Solution

题意简洁系列。
顺带一说,字串不可重。
显然Dp。
三维可能会算重,多开一维,表示前面是不是连续一段匹配的。
然后就没有了。

COde

#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define N 1005using namespace std;int n,m,k,f[N][N][11][2];char s[N],st[N];int main() {    freopen("string.in","r",stdin);    freopen("string.out","w",stdout);    scanf("%d%d%d",&n,&m,&k);    scanf("%s",s+1);scanf("%s",st+1);    fo(i,1,n) fo(j,1,m) fo(l,1,k) {        f[i][j][l][0]=max(f[i-1][j][l][1],f[i][j-1][l][1]);        f[i][j][l][0]=max(f[i][j][l][0],max(f[i-1][j][l][0],f[i][j-1][l][0]));        if (s[i]==st[j]) {            f[i][j][l][1]=f[i-1][j-1][l-1][0]+1;            if (s[i-1]==st[j-1]) f[i][j][l][1]=            max(f[i][j][l][1],f[i-1][j-1][l][1]+1);        }    }    printf("%d",max(f[n][m][k][0],f[n][m][k][1]));}
0 0
原创粉丝点击