bzoj3304[Shoi2005]带限制的最长公共子序列 DP

题意:X与Y的公共子序列并且包含Z,求最长。。。

这题不就是4275的弱化版吗。。为啥不能过啊??
样例还错?不滚动还会T?这都是什么鬼啊,要是有谁知道求解一下。。
具体的话就是设f[i][j][k]表示分别匹配到i,j,k位,转移很显然。
第三维滚动一下。
~~~~~~~~~~~~~~~~~~~~~~~~分割线
4275要求的是子串,这个是子序列,我眼瞎了。。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=505;
int f[N][N][2];
char a[N],b[N],c[N];
int n,m,q;
int main()
{
    scanf("%s",a);
    scanf("%s",b);
    scanf("%s",c);
    n=strlen(a);
    m=strlen(b);
    q=strlen(c);
    int now=0;
    fo(k,0,q)
    {
        now=1-now;
        fo(i,0,n)
        fo(j,0,m)
        if (i+j+k)
        {
            f[i][j][now]=-0x37373737;
            if (i)f[i][j][now]=max(f[i][j][now],f[i-1][j][now]);
            if (j)f[i][j][now]=max(f[i][j][now],f[i][j-1][now]);
            if (i&&j)
            if (a[i-1]==b[j-1])
            {
                f[i][j][now]=max(f[i][j][now],f[i-1][j-1][now]+1);
                if (a[i-1]==c[k-1]&&k)
                    f[i][j][now]=max(f[i][j][now],f[i-1][j-1][now^1]+1);
            }
        }   
    }
    if (f[n][m][now]<0)printf("NO SOLUTION");
    else printf("%d\n",f[n][m][now]);
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页