BZOJ 2764 [JLOI2011]基因补全
来源:互联网 发布:永诚网络 编辑:程序博客网 时间:2024/06/05 12:46
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2764
题意:给定一个长度为n的碱基序列S和一个长度为m的碱基序列T,现在希望向序列T里补一定的碱基使得序列S和序列T配对,配对的规则是A
与T
配对,C
与G
配对,添加碱基的位置与数量不同的方案视为不同,求不同的方案数。
题解:
可以考虑算出序列T在序列S里匹配的本质不同方案数,利用dp可以很容易解决这个问题。
令
粗略估计答案的上界,可以发现存在情况使得答案超过
代码:
#include <cstdio>const int maxn = 2001, maxl = 70, mod = 1000000000;struct BigInt{ int len, num[maxl]; void getint(const int &x) { num[len++] = x; } void Print() { printf("%d", num[len - 1]); for(int i = len - 2; i >= 0; --i) printf("%9.9d", num[i]); putchar('\n'); } void operator += (const BigInt &x) { if(len < x.len) len = x.len; for(int i = 0; i < len; ++i) { num[i] += x.num[i]; if(num[i] >= mod) { num[i] -= mod; ++num[i + 1]; } } if(num[len]) ++len; }} f[maxn];inline bool check(char a, char b){ return a == 'A' && b == 'T' || a == 'G' && b == 'C' || a == 'C' && b == 'G' || a == 'T' && b == 'A';}int n, m;char s[maxn], t[maxn];int main(){ scanf("%d%d%s%s", &n, &m, s, t); f[0].getint(1); for(int i = 1; i <= n; ++i) for(int j = m; j; --j) if(check(s[i - 1], t[j - 1])) f[j] += f[j - 1]; f[m].Print(); return 0;}
0 0
- BZOJ 2764 [JLOI2011]基因补全
- 2764: [JLOI2011]基因补全
- bzoj2764 [JLOI2011]基因补全
- 基因补全
- bzoj[JLOI2011]飞行路线
- 【BZOJ】【JLOI2011】飞行路线
- BZOJ [JLOI2011]不重复数字
- BZOJ 2763: [JLOI2011]飞行路线
- bzoj 2763 [JLOI2011]飞行路线
- BZOJ 2763 [JLOI2011]飞行路线
- BZOJ 2763 [JLOI2011]飞行路线
- bzoj 2763: [JLOI2011]飞行路线
- bzoj 2763: [JLOI2011]飞行路线
- BZOJ 2763 [JLOI2011]飞行路线
- BZOJ 2762 JLOI2011 不等式组 树状数组
- BZOJ 2763 [JLOI2011]飞行路线 Dijikstra
- bzoj 2761: [JLOI2011]不重复数字
- bzoj 2761: [JLOI2011]不重复数字 排序
- c/c++程序编译连接过程
- 互联网软件工程师所需技能
- 微信开放平台入门时遇到的重要问题总结
- DWR使用笔记
- objective-c 内管管理3
- BZOJ 2764 [JLOI2011]基因补全
- Android camera bring up
- esp8266路由模式设置
- Java如何扫描指定package下所有的类
- 动态申请和释放一个二维数组
- 三十四、异常(一)异常抛出、异常捕获、异常传播
- LeetCoder 解题报告 3Sum
- 查找试题--互换函数swap初试
- 快速傅里叶变换算法