BZOJ3864 : Hero meet devil

考虑计算LCS的DP过程,设f[i][j]表示T串的前i项与S串的前j项的LCS,则

若T[i]==S[j],则f[i][j]=f[i-1][j-1]+1

否则f[i][j]=max(f[i-1][j],f[i][j-1])

对于固定的i,f[i][j]只可能为f[i][j-1]或f[i][j-1]+1,把这个差值用二进制表示成状态。

先预处理出每个状态后面加了一个字符后会到达什么状态,然后进行状压DP即可。

时间复杂度$O(m2^n)$。

#include<cstdio>
#include<cstring>
const int N=15,P=1000000007;
int T,n,m,i,j,k,x,a[N+1],f[N+1],g[N+1],v[1<<N][4],F[2][1<<N],ans[N+1];char s[N+1];
inline void up(int&a,int b){a+=b;if(a>=P)a-=P;}
void work(){
  scanf("%s%d",s+1,&m);n=std::strlen(s+1);
  for(i=1;i<=n;i++){
    if(s[i]==‘A‘)a[i]=0;
    if(s[i]==‘G‘)a[i]=1;
    if(s[i]==‘T‘)a[i]=2;
    if(s[i]==‘C‘)a[i]=3;
  }
  for(i=0;i<1<<n;i++){
    for(j=0;j<n;j++)f[j+1]=f[j]+(i>>j&1);
    for(j=0;j<4;j++){
      for(k=1;k<=n;k++)if(a[k]==j)g[k]=f[k-1]+1;else g[k]=f[k]>g[k-1]?f[k]:g[k-1];
      for(v[i][j]=0,k=1;k<=n;k++)if(g[k]>g[k-1])v[i][j]|=1<<(k-1);
    }
  }
  for(j=0;j<1<<n;j++)F[0][j]=0;
  for(F[0][0]=1,i=x=0;i<m;i++,x^=1){
    for(j=0;j<1<<n;j++)F[x^1][j]=0;
    for(j=0;j<1<<n;j++)if(F[x][j])for(k=0;k<4;k++)up(F[x^1][v[j][k]],F[x][j]);
  }
  for(i=0;i<=n;i++)ans[i]=0;
  for(i=0;i<1<<n;i++)up(ans[__builtin_popcount(i)],F[x][i]);
  for(i=0;i<=n;i++)printf("%d\n",ans[i]);
}
int main(){
  for(scanf("%d",&T);T--;work());
  return 0;
}

  

时间: 2024-10-11 13:32:04

BZOJ3864 : Hero meet devil的相关文章

bzoj千题计划241:bzoj3864: Hero meet devil

http://www.lydsy.com/JudgeOnline/problem.php?id=3864 题意: 给你一个DNA序列,求有多少个长度为m的DNA序列和给定序列的LCS为0,1,2.... 求LCS方式:f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]*(s[i]==t[j])) 固定了i,相邻的j的f[i][j]值最多相差1 dp[i][j] 表示长度为i的DNA序列,将“f[ |S| ][j+1]是否比f[ |S| ][j] 大1” 这个状

【BZOJ3864】Hero meet devil DP套DP

[BZOJ3864]Hero meet devil Description There is an old country and the king fell in love with a devil. The devil always asks the king to do some crazy things. Although the king used to be wise and beloved by his people. Now he is just like a boy in lo

[hdu 4899]14年多校第四场C Hero meet devil 状压DP

Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 122    Accepted Submission(s): 49 Problem Description There is an old country and the king fell in love with a devil. The devil always asks th

bzoj 3864: Hero meet devil(dp套dp)

题面 给你一个只由\(AGCT\)组成的字符串\(S (|S| ≤ 15)\),对于每个\(0 ≤ .. ≤ |S|\),问 有多少个只由\(AGCT\)组成的长度为\(m(1 ≤ m ≤ 1000)\)的字符串\(T\),使得\(LCS(T,S)=i\)? 题解 老早就听说这个叫做\(dp\ of\ dp\)的神仙了--然而一直没学-- 我们先考虑\(LCS\)是怎么转移的,设\(LCS(i,j)\)表示第一个串到\(i\),第二个串到\(j\)为止的最长公共子序列,那么转移为 \[ LCS(

东北育才10天大总结

老师们 Scanf的嗓门照例是最大的.恩. “我是山里的孩子……小的时候背书,整个山头都听得见……” 有一个哈师大附中的竞赛教练很……怎么说呢?接地气好了. Scanf说东北人很耿直,似乎确实是这样的.衡水的教练早就被遣返了…… “他啊,监考去了!” 虽然他不在,但还是不还手机.让衡水的人天天在电脑上颓废…… Scanf不在,你看我们就很老实.他到处“乱”玩,甚至跑到了国境线边,连火车票都忘了买,坐高铁去,乘绿皮火车回,路过长白山就去玩了一趟,结果暴风雪逼得他去吃“暴辣”的烤鱿鱼. “我看<三八

用流程描述合法状态

我似乎记得 Polya 的<怎样解题表>提示我 "从尽可能多不同的角度将原问题进行描述" ,也似乎记得有某篇集训队论文的题目叫做<退一步,海阔天空> ,我想,用一个流程来对题目中的合法状态进行描述,能获得许多不一样的理解吧. 就目前做的题来看,这种观点大多用于计数问题,或者一些最优性问题. [TH 2140] 计数 给 $n_1(\le 1000)$ 个 $A$ .$n_2(\le 1000)$ 个 $B$ .$n_3(\le 1000)$ 个 $C$ .$n_

ZR8.2 DP

DP 1CF1101D 我们发现,最终答案一定和质因数有关 我们发现\(w_i <= 2*10^5\)级别的树,他的素因子的个数不会非常多(\(<=10\)) 然后我们就设 gcd是\(dp_{u,v}\)表示\(u\)节点的第\(v\)个素因子的倍数答案 很明显答案只能从相同的质因子去转移 \[ dp_{u,v} = \max_{p_v = p_{v'}}{(dp_{son_u,v'})} + 1 \] 每次合并子树时利用dp数组更新ans就好了 2 CF1039D 很明显,当\(k >

记录 [补档]

数学 概率论 计数问题 数论 线性代数 博弈论 比赛经验 不要通过数据大小猜测正解的时间复杂度. 把一个方法想到底. DP题假如实在不会的话, 果断跳过, 找思维量更小的数据结构题. 一些方法 二分 DP, 尤其多想矩阵乘法优化DP 网络流 FFT 日程表 Fri, Nov 10 明天就是NOIp了. 从上次记录到现在已经将近一个月了, 这个月, 真心没有进步多少, 完全不再状态. 希望不要AFO吧. 这可能是最后一篇记录了. Sun, Oct 22 AHOI 2009 中国象棋: 统计在棋盘上

HDOJ 4901 The Romantic Hero

DP....扫两遍组合起来 The Romantic Hero Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 547    Accepted Submission(s): 217 Problem Description There is an old country and the king fell in love with a