bzoj3864次元联通们

第一次写dp of dp (:з」∠) 不能再颓废啦

考虑最长匹配序列匹配书转移

由于dp[i][j]的转移可由上一行dp[i-1][j-1],dp[i-1][j],dp[i][j-1]得来

把dp[i]差分,得到一个01串

就可以用rans[s][ch]表示在状态s的dp数组后面接字符ch可以转移到的状态

枚举该转移就好了QAQ

/**************************************************************
Problem: 3864
Language: C++
Result: Accepted
Time:4208 ms
Memory:2356 kb
****************************************************************/
//f[i]为之前前i项的LCS,g[i]为添加字母之后的
//g数组的差值就是下一次匹配转移到的状态
#include<cstdio>
#include<cstring>
#include<algorithm>
using std::memset;
const int mod= 1000000007;
inline int read() {
int x=0,f=1;
char c=getchar() ;
while(c<'0'||c>'9') {
if(c=='-')f=-1;
c=getchar();
}
while(c<='9'&&c>='0') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}const int maxn = 16;
int cnt,m,n;
char a[40];
int tans[1<<maxn][4];
int ans[2][1<<maxn],f[maxn],g[maxn];
int is[maxn];
int s[maxn];
void network(int maxx) {
int now=1;
memset(ans,0,sizeof ans);
ans[0][0]=1;
for(int i=1;i<=m;++i,now=i&1) {
for(int j=0;j<4;++j)
for(int e=0;e<maxx;++e)
ans[now][tans[e][j]]=(ans[now][tans[e][j]]+ans[now^1][e])%mod;
memset(ans[now^1],0,sizeof ans[now^1]);
//now=i&1;
}
now^=1;
memset(is,0,sizeof is);
for(int i=0;i<maxx;++i) is[__builtin_popcount(i)]=(is[__builtin_popcount(i)]+ans[now][i])%mod;
for(int i=0;i<=n;++i)printf("%d\n",is[i]);
}
void solve(int m,int n) {
int maxx=1<<n;
for(int i=0;i<maxx;++i) {
f[0]=i&1;
for(int j=1;j<n;++j) f[j]=((i>>j)&1)+f[j-1];
for(int j=0;j<4;++j) {
memset(g,0,sizeof g);
for(int e=0;e<n;++e) {
if(s[e]==j) g[e] = f[e-1]+1;//最后一位与原来匹配
else g[e]=std::max(g[e-1],f[e]);
}
int tmp = 0;
for(int e=0;e<n;++e)
if(g[e]==g[e-1]+1)
tmp|=1<<e;
tans[i][j]=tmp;
}
}
network(maxx);
}
int main() {
cnt=read();
for(int i=1;i<=cnt;++i) {
scanf("%s",a);
m=read();n=strlen(a);
for(int i=0;i<n;++i)
if(a[i]=='A') s[i]=0;
else if(a[i]=='T') s[i]=1;
else if(a[i]=='C') s[i]=2;
else if(a[i]=='G') s[i]=3;
solve(m,n);
}
return 0;
}

最新文章

  1. python 学习笔记十五 django基础
  2. setWinldowRgn
  3. 关于MFC文本框输入内容的获取 与 设置文本框的内容
  4. 由DataGridTextColumn不能获取到父级DataContext引发的思考
  5. iOS之沙盒机制和如何获取沙盒路径
  6. hdu5593/ZYB&#39;s Tree 树形dp
  7. laravel的多态关联--morphTo和morphMany
  8. nopcommerce中文网
  9. 多线程11_张孝祥 java5的线程锁技术
  10. Hibernate(一)——采用Hibernate框架开发环境搭建
  11. mysql命令参数详解
  12. csv导入数据到mysql
  13. python函数(5):迭代器和生成器
  14. MonkeyRunner 之如何获取APP的Package Name和Activity Name
  15. Jenkins创建job时Check-out Strategy各个选项详细说明(含图)
  16. jsp 嵌入页面
  17. scrapy 的一个例子
  18. 转转转---js正则表达exec与match的区别说明
  19. lintcode-457-经典二分查找问题
  20. MQ测试

热门文章

  1. Jmeter 参数化之 CSV Data Set Config 循环读取参数
  2. visio2013密钥
  3. input()报错:TypeError: &#39;&gt;=&#39; not supported between instances of &#39;str&#39; and &#39;int&#39;
  4. 【转载】Unity3D研究院之静态自动检查代码缺陷与隐患
  5. Box布局管理
  6. (原)Unreal渲染相关的缓冲区 及其 自定义代码几种抓取
  7. Python namedtuple(命名元组)使用实例
  8. juqery基本选择器和层级选择器
  9. 用Linkedhashmap的LRU特性及SoftReference软引用构建二级缓存
  10. P4285 [SHOI2008]汉诺塔