JZOJ 3747(状压DP)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZOJ 3747(状压DP)相关的知识,希望对你有一定的参考价值。

这题是一道状压DP,暂时还不是很懂.

技术分享
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int LENM=1010,N=11,M=1e9+7;
char s[N];
int n,m,u,ind[200],f[LENM][1<<10],g[N],ans[N],gg[N],num1[1<<10],ff[1<<10][5];
int main(){
    scanf("%s%d",s+1,&m);
    n=strlen(s+1); u=1<<n; f[0][0]=1;
    ind[A]=1; ind[C]=2; ind[G]=3; ind[T]=4;
    for (int i=1; i<=n; i++) s[i]=ind[s[i]];
    for (int i=0; i<u; i++){
        for (int k=1; k<=n; k++) g[k]=(1&(i>>k-1))+g[k-1];
        for (int j=1; j<=4; j++){
            int res=0;
            for (int k=1; k<=n; k++){
                gg[k]=max(max(g[k-1]+(s[k]==j),gg[k-1]),g[k]);
                res|=(gg[k]-gg[k-1])<<k-1;
            }
            ff[i][j]=res;
        }
    }
    for (int i=0; i<m; i++)
    for (int j=0; j<u; j++)
    if (f[i][j]) for (int k=1; k<=4; k++) (f[i+1][ff[j][k]]+=f[i][j])%=M;
    for (int i=0; i<u; i++){
        if (i) num1[i]=num1[i-1&i]+1;
        (ans[num1[i]]+=f[m][i])%=M;
    }
    for (int i=0; i<=n; i++) printf("%d\n",ans[i]);
}
View Code

 一篇好的博客http://blog.csdn.net/HOWARLI/article/details/69487024

以上是关于JZOJ 3747(状压DP)的主要内容,如果未能解决你的问题,请参考以下文章

jzoj5990. 北大2019冬令营模拟2019.1.6Bear (状压dp)

[状压DP][DFS]JZOJ 2679 跨时代

[JZOJ5398]:Adore(状压DP+记忆化搜索)

ybtoj 状压DP课堂过关 例题1jzoj 1266 luogu P1879 [USACO06NOV]Corn Fields G & 玉米田 & 种植方案

jzoj 5230_队伍统计_dp

HDU4057 Rescue the Rabbit(AC自动机+状压DP)