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” 这个状态压缩为j的方案数

若我们知道 状态j加上一个字母k可以到状态nxt[j][k]

那么dp[i+1][nxt[j][k]]+=dp[i][j]

关键是如何求得nxt[j][k]

再一次DP

枚举所有的状态i

令f[j] 表示加上字母k之前的LCS长度,g[j]表示加上字母k之后的LCS长度

g[j]=max(g[j-1],f[j])

如果加上的字母k和原序列第j个字母匹配 g[i]=max(g[j],f[j-1]+1)

g求完后,项邻的两个g要么相等,要么相差1

再把这个状态压缩起来即可

#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;const int mod=1e9+7;int m;char ss[16];
int L,S;
int s[16];int ch[26];int f[16],g[16];
int nxt[1<<15][4];int dp[2][1<<15];
int ans[16];void pre()
{int len; int c[16];for(int i=0;i<S;++i){memset(f,0,sizeof(f));for(int j=1;j<=L;++j) f[j]=f[j-1]+(i>>j-1&1);for(int k=0;k<4;++k){for(int j=1;j<=L;++j){g[j]=max(g[j-1],f[j]);if(s[j]==k) g[j]=max(g[j],f[j-1]+1);}nxt[i][k]=0;for(int j=0;j<L;++j)if(g[j+1]-g[j]) nxt[i][k]+=1<<j;}}
}int count(int x)
{int sum=0;while(x){sum+=x&1;x>>=1;}return sum;
}void DP()
{memset(dp,0,sizeof(dp));int now=1,last=0;dp[0][0]=1;for(int i=1;i<=m;++i){memset(dp[now],0,sizeof(dp[now]));for(int j=0;j<S;++j)for(int k=0;k<4;++k){dp[now][nxt[j][k]]+=dp[last][j];dp[now][nxt[j][k]]-=dp[now][nxt[j][k]]>=mod ? mod : 0;}swap(now,last);}memset(ans,0,sizeof(ans));int t;for(int i=0;i<S;++i) {t=count(i);ans[t]+=dp[last][i];ans[t]-=ans[t]>=mod ? mod : 0;}for(int i=0;i<=L;++i) printf("%d\n",ans[i]);
}int main()
{ch['A'-'A']=0;ch['C'-'A']=1;ch['G'-'A']=2;ch['T'-'A']=3;int T;scanf("%d",&T);while(T--){scanf("%s",ss+1);scanf("%d",&m);L=strlen(ss+1);S=1<<L;for(int i=1;i<=L;++i) s[i]=ch[ss[i]-'A'];pre();DP();}return 0;
}

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8454799.html

bzoj千题计划241:bzoj3864: Hero meet devil相关推荐

  1. BZOJ 2150. 部落战争(最小路径覆盖问题)【BZOJ千题计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 刷题就图一乐 题目链接 https://hydro.ac/d/bzoj/p/2150 是 hydro ...

  2. BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2151 是 hydro 的 BZOJ ...

  3. BZOJ 1799 [Ahoi2009] self 同类分布(数位DP)【BZOJ千题计划(quexin】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/1799(样例时限设置有问题,应该为 2 ...

  4. bzoj千题计划143:bzoj1935: [Shoi2007]Tree 园丁的烦恼

    http://www.lydsy.com/JudgeOnline/problem.php?id=1935 二维偏序问题 排序x,离散化树状数组维护y #include<cstdio> #i ...

  5. bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战

    http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...

  6. bzoj千题计划203:bzoj3994: [SDOI2015]约数个数和

    http://www.lydsy.com/JudgeOnline/problem.php?id=3994 设d(x)为x的约数个数,给定N.M,求 用到的一个结论: 证明: 枚举n的约数i,枚举m的约 ...

  7. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  8. bzoj千题计划201:bzoj1820: [JSOI2010]Express Service 快递服务

    http://www.lydsy.com/JudgeOnline/problem.php?id=1820 很容易想到dp[i][a][b][c] 到第i个收件地点,三个司机分别在a,b,c 收件地点的 ...

  9. bzoj千题计划303:bzoj4827: [Hnoi2017]礼物

    https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子化简一下,发现最后只跟 Σ xi*yi 有关 第二个序列反转,就可以用FFT优化 注意: ...

最新文章

  1. Java项目:在线商城系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
  2. oracle 字符串转为正数用 to_number()……
  3. glassfish 4配置_自己构建GlassFish 4.0快照
  4. hdu 3094——A tree game
  5. 未能加载包studio package_Python包开发者的必备清单
  6. python boxplot pvalue_使用python和matplotlib获取boxplot中使用的值
  7. 算法提高 求最大值java_算法笔记_096:蓝桥杯练习 算法提高 求最大值(Java)
  8. 2020年已裸辞5个月(软文)
  9. 如何访问docker内php,如何进入docker容器
  10. springmvc mybatis redis mysql maven搭建基本开发框架 (二)
  11. vs插件VS10x CodeMap 注册码
  12. 服务器图标怎么显示在任务栏,win10任务栏右侧的图标如何显示或隐藏起来?附图文教程...
  13. LocalDateTime返回的时间中带有T
  14. 肉体的情欲、眼目的情欲、今…
  15. Java多线程-实现Callable接口的call()方法,示例
  16. 永磁同步电机PMSM极对数的测量方法
  17. 华为AP无线局域网配置步骤
  18. 小鸡模拟器android怎么玩,安卓小鸡模拟器运行总结~
  19. android开发音乐播放器,Android开发简易音乐播放器
  20. JVM之垃圾回收算法详解

热门文章

  1. MyEclipse运行时自动保存
  2. 手机客户端测试考虑的点
  3. Python:常用模块简介(1)
  4. js实现向上滚动效果
  5. 关于“wap2app仅支持对已通过ICP备案的域名站点进行打包”问题解决
  6. javascript --- 手写Promise、快排、冒泡、单例模式+观察者模式
  7. javascript --- 瀑布流的实现
  8. ES5 every/some/reduce/reduceRight的使用与重写
  9. Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
  10. 学界 | CVPR 2018颁布五大奖项,何恺明获年轻学者奖