博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3864 Hero meet devil
阅读量:4967 次
发布时间:2019-06-12

本文共 2069 字,大约阅读时间需要 6 分钟。

题面

题解

$dp$套$dp$。。。

根据$lcs$的转移:

$$ lcs[i][j]=max \begin{cases} lcs[i-1][j-1]+1 & (t[i] = s[j]) \\ max(lcs[i-1][j],lcs[i][j-1]) & (t[i]\neq s[j]) \end{cases} $$

于是$lcs[i][j] - lcs[i][j - 1] \leq 1$

因为$|S|\leq 15$我们可以状压差分后的$lcs[i]$数组。

设$f[i][S]$表示$dp$到第$i$位,$lcs[i]$为$S$的方案数,

然后枚举这个位置选$\text{A/G/C/T}$的哪一个。

设$trans[S][\text{A/G/C/T}]$为$lcs$为$S$时加一个字母后的$lcs$的状态

这个可以预处理出来。

于是转移方程为:

$$ f[i][trans[S][\text{A/G/C/T}]] \text{+=}f[i-1][S] $$

边界$f[0][0]=1$

代码

#include
#include
#include
#include
#define RG register#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);#define clear(x, y) memset(x, y, sizeof(x))#define pcnt __builtin_popcountconst int maxn(1001), Mod(1e9 + 7), LEN(15);char s[LEN + 1], S_now[] = "AGCT";int a[LEN + 1], f[maxn][(1 << LEN) | 2], T, LIM, ans[maxn];int trans[(1 << LEN) | 2][5], n, len, tmp[2][LEN + 1];int Calc(int S, int c){ int ans = 0; clear(tmp, 0); for(RG int i = 0; i < n; i++) tmp[0][i + 1] = tmp[0][i] + ((S >> i) & 1); for(RG int i = 1; i <= n; i++) { int max = 0; if(a[i] == c) max = tmp[0][i - 1] + 1; max = std::max(std::max(max, tmp[0][i]), tmp[1][i - 1]); tmp[1][i] = max; } for(RG int i = 0; i < n; i++) ans += (1 << i) * (tmp[1][i + 1] - tmp[1][i]); return ans;}int main(){#ifndef ONLINE_JUDGE file(cpp);#endif scanf("%d", &T); while(T--) { clear(f, 0); clear(ans, 0); scanf("%s", s + 1); n = strlen(s + 1); LIM = (1 << n); for(RG int i = 1; i <= n; i++) for(RG int j = 0; j < 4; j++) if(s[i] == S_now[j]) { a[i] = j + 1; break; } scanf("%d", &len); f[0][0] = 1; for(RG int i = 0; i < LIM; i++) for(RG int j = 1; j <= 4; j++) trans[i][j] = Calc(i, j); for(RG int i = 1; i <= len; i++) for(RG int S = 0; S < LIM; S++) for(RG int k = 1; k <= 4; k++) f[i][trans[S][k]] = (f[i][trans[S][k]] + f[i - 1][S]) % Mod; for(RG int S = 0; S < LIM; S++) ans[pcnt(S)] = (ans[pcnt(S)] + f[len][S]) % Mod; for(RG int i = 0; i <= n; i++) printf("%d\n", ans[i]); } return 0;}

转载于:https://www.cnblogs.com/cj-xxz/p/10220486.html

你可能感兴趣的文章
unity3d 移动与旋转 2
查看>>
MyEclipse安装Freemarker插件
查看>>
php 文件下载
查看>>
寻找二叉查找树中比指定值小的所有节点中最大的那个节点
查看>>
如何设置输入框达到只读效果
查看>>
RT3070 USB WIFI 在连接socket编程过程中问题总结
查看>>
MIS外汇平台荣获“2013年全球最佳STP外汇交易商”
查看>>
LeetCode 题解之Add Digits
查看>>
高性能分布式计算与存储系统设计概要(下篇)
查看>>
案例------冒泡排序
查看>>
Hexo中添加emoji表情
查看>>
Xml处理工具类(Jdom)
查看>>
hdu1502 , Regular Words, dp,高精度加法
查看>>
20120227_CET6
查看>>
SpringBoot在idea中的热部署配置
查看>>
MyEclipse连接SQL Server 2008数据库的操作方法
查看>>
SqlCel 和MySQL for Excel在批量处理数据上的优劣
查看>>
leetcode【67】-Bulb Switcher
查看>>
JS验证图片格式和大小并预览
查看>>
调节心态的十种做法
查看>>