BZOJ 3864 Hero meet devil DP套DP

原创 2015年07月10日 09:30:50

题目大意:给定一个长度为n(n15)的基因序列S,求对于每个i(0in)有多少长度为m(m1000)的基因串T满足STLCSi

考虑LCS怎么求
fi,j表示T的前i位和S的前j位的LCS
我们发现每一行之和上一行的状态有关

那么在这个问题中,我们令fi,j表示T的前i位与SLCS状态的第i行为j的状态数
由于每一行相邻两数最多差1,因此状态数不会超过2n,用一个二进制数存储相邻两项的差值即可
预处理所有转移后直接DP,时间复杂度O(4n2n+4m2n)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MOD 1000000007
using namespace std;
const char letters[]={'A','C','G','T'};
int n,m;
char s[20];
int trans[1<<15][4],cnt[1<<15],f[2][1<<15];
void Pretreatment()
{
    int i,j,k;
    for(i=0;i<1<<n;i++)
    {
        static int f[20],g[20];
        for(j=1;j<=n;j++)
            f[j]=f[j-1]+(i&(1<<j-1)?1:0);
        cnt[i]=f[n];
        for(k=0;k<4;k++)
        {
            for(j=1;j<=n;j++)
            {
                g[j]=max(g[j-1],f[j]);
                if(letters[k]==s[j])
                    g[j]=max(g[j],f[j-1]+1);
            }
            trans[i][k]=0;
            for(j=1;j<=n;j++)
                if(g[j]-g[j-1])
                    trans[i][k]|=1<<j-1;
        }

    }
}
int main()
{
    int T,i,j,k;
    for(cin>>T;T;T--)
    {
        scanf("%s%d",s+1,&m);
        n=strlen(s+1);
        Pretreatment();
        memset(f,0,sizeof f);
        f[0][0]=1;
        for(i=1;i<=m;i++)
        {
            memset(f[i&1],0,sizeof(f[0][0])<<15);
            for(j=0;j<1<<n;j++)
                for(k=0;k<4;k++)
                    (f[i&1][trans[j][k]]+=f[~i&1][j])%=MOD;
        }
        static int ans[20];
        memset(ans,0,sizeof ans);
        for(i=0;i<1<<n;i++)
            (ans[cnt[i]]+=f[m&1][i])%=MOD;
        for(i=0;i<=n;i++)
            printf("%d\n",ans[i]);
    }
    return 0;
}

相关文章推荐

[BZOJ3864]Hero meet devil(状压dp)

题意:给一个长度 这个题让我想起了之前做过的一个数位dp,问有多少个数的数字组成的最长上升子序列长度为x。那个题中显然最长上升子序列不超过10,我们用状态压缩来模拟那个做lis时的栈即可。 这个题...

[BZOJ 3864][HDU 4899]Hero meet devil(DP套DP)

题目链接:(1)http://www.lydsy.com/JudgeOnline/problem.php?id=3864 (2)http://acm.hdu.edu.cn/showproblem.p...
  • qpswwww
  • qpswwww
  • 2015年02月19日 12:17
  • 1586

bzoj 3864 dp套dp

题意:给一个长度为n(n

[HDU 5079][2014 Asia AnShan Regional Contest]Square(DP套DP)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5079题目大意给你一个n⋅n(n≤8)n · n(n ≤ 8)的棋盘,上面有一些格子必须是黑色,其它可以染...
  • qpswwww
  • qpswwww
  • 2015年02月19日 17:18
  • 1266

bzoj4102(基于图的神dp)

 为了庆祝贝茜的生日,FJ给她吃草的自由. N块草地,标号1到N(1 算出贝茜能够获得的最大能量. 首先以每个点为起点跑一次BFS,求出任意两点间的最短距离dis[i][j]...

bzoj2863图上的DP题

题目传送门 题解传送门 这题解最后一步似乎没讲清如何容斥的,或许是在大佬眼里,这过于显然(也可能是容斥的某个常用公式?)然而我并不知道,还是证一下吧。 对于有ii个点的图,记至少有j个入度为0的...
  • zxin__
  • zxin__
  • 2017年08月15日 23:31
  • 61

BZOJ 3812 主旋律 状压DP+容斥原理

题目大意:给定一张有向图,求这张有向图的生成子图中有多少强连通图 正着做不好做,我们考虑容斥原理 如果一个图不连通,那么这张图缩点之后一定会形成一个点数>=2的DAG 一个DAG中一定会有一些入...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年04月15日 14:48
  • 2503

bzoj 2560: 串珠子 子集dp

虽然我这么弱但做做这种sb题还是没问题的。。。都水了一个早上sb题了还不狗带        令f[i]表示集合为i时的方案数,然后全集减去不合法的就好了。不合法的话可以用一个定点来枚举。时间复杂度O(...

【bzoj3193】[JLOI2013]地形生成 dp+组合数学

好难呀!!! 第一问: 从大到小往里插 不考虑相等的情况 第i大的数有min(i,b[i]+1)个位置可以插 考虑相等的情况 把相等的提出来一起处理 min(i,b[i]+1)+j-i ...

【bzoj4197】[Noi2015]寿司晚宴 dp

因为每个数只有一个大于根号n的质因子,所以我们把每个数拆成一个大于根号n的质因子乘以一个数的形式,对于大于根号n的质因子相同的数,我们放到一起处理 dp[0/1][i][x][y]表示A/B选了当前...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ 3864 Hero meet devil DP套DP
举报原因:
原因补充:

(最多只允许输入30个字)