2764: [JLOI2011]基因补全
2764: [JLOI2011]基因补全
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 570 Solved: 187
Description
在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对,C总与G配对。两个碱基序列能相互匹配,当且仅当它们等长,并且任意相同位置的碱基都是能相互配对的。例如ACGTC能且仅能与TGCAG配对。一个相对短的碱基序列能通过往该序列中任意位置补足碱基来与一个相对长的碱基序列配对。补全碱基的位置、数量不同,都将视为不同的补全方案。现在有两串碱基序列S和T,分别有n和m个碱基(n>=m),问一共有多少种补全方案。
Input
数据包括三行。
第一行有两个整数n,m,表示碱基序列的长度。
第二行包含n个字符,表示碱基序列S。
第三行包含m个字符,表示碱基序列T。
两个碱基序列的字符种类只有A,C,G,T这4个大写字母。
Output
答案只包含一行,表示补全方案的个数。
Sample Input
10 3 CTAGTAGAAG TCC
Sample Output
4
HINT
样例解释:
TCC的4种补全方案(括号中字符为补全的碱基)
(GA)TC(AT)C(TTC)
(GA)TC(ATCTT)C
(GA)T(CAT)C(TT)C
(GATCA)TC(TT)C
数据范围:
30%数据n<=1000,m<=2
50%数据n<=1000,m<=4
100%数据n<=2000,m<=n
Source
题解:一道萌萌哒DP问题,引用某神犇的题解
题解: 可以考虑算出序列T在序列S里匹配的本质不同方案数,利用dp可以很容易解决这个问题。 令f[i][j]表示序列S前i位匹配序列T至第j位的方案数,则对于f[i][j],若不用S[i]匹配T[j],则为f[i−1][j],若能匹配,则可由f[i−1][j−1]转化至该状态,最终的答案为f[n][m],dp可滚动。
然后关键来了——数量是完全可能超过( {2}^{64} )的,所以可以,或者说必须进行高精度运算,害得我狂WA不止
然后我写了个萌萌哒高精度,于是还是狂WA不止(下面那个数组开炸了请无视TT)
然后最后发现是高精度加法里面没清零= =,然后
没有然后了
1 /**************************************************************
2 Problem: 2764
3 User: HansBug
4 Language: Pascal
5 Result: Accepted
6 Time:4380 ms
7 Memory:4168 kb
8 ****************************************************************/
9
10 type
11 arr=array[0..500] of longint;
12 var
13 i,j,k,l,m,n:longint;ch:char;
14 c:array[0..2005] of arr;
15 a,b:array[0..2005] of longint;
16 function max(x,y:longint):longint;
17 begin
18 if x>y then max:=x else max:=y;
19 end;
20 function add(a,b:arr):arr;
21 var c:arr;i,j,k:longint;
22 begin
23 fillchar(c,sizeof(c),0);
24 c[0]:=max(a[0],b[0])+1;k:=0;
25 for i:=1 to c[0] do
26 begin
27 k:=k+a[i]+b[i];
28 c[i]:=k mod 10;
29 k:=k div 10;
30 end;
31 while k>0 do
32 begin
33 inc(c[0]);
34 c[c[0]]:=k mod 10;
35 k:=k div 10;
36 end;
37 while (c[0]>1) and (c[c[0]]=0) do dec(c[0]);
38 exit(c);
39 end;
40 procedure outp(a:arr);
41 var i:longint;
42 begin
43 for i:=a[0] downto 1 do write(a[i]);
44 writeln;
45 end;
46 function trans(ch:char):longint;
47 begin
48 case upcase(ch) of
49 'A':exit(1);
50 'C':exit(2);
51 'T':exit(4);
52 'G':exit(3);
53 end;
54 end;
55 begin
56 readln(n,m);
57 for i:=1 to n do
58 begin
59 read(ch);
60 a[i]:=5-trans(ch);
61 end;
62 readln;
63 for i:=1 to m do
64 begin
65 read(ch);
66 b[i]:=trans(ch);
67 end;
68 readln;fillchar(c[0],sizeof(c[0]),0);c[0][0]:=1;c[0][1]:=1;
69 for i:=1 to n do
70 for j:=m downto 1 do
71 if a[i]=b[j] then c[j]:=add(c[j],c[j-1]);
72 outp(c[m]);
73 readln;
74 end.
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- jQuery 文本属性值
- 10.4【前端开发】页面布局:如何理解 “CSS 视觉格式化模型”?
- Android Material UI控件之ShapeableImageView
- jQuery 元素操作
- jQuery 事件注册和事件处理
- 10.5 块级盒子模型(原盒子模型):两种盒子有什么不同?
- Android Material UI控件之MaterialButton
- jQuery (事件、拷贝)对象
- 10.6 border-color简写属性:如何理解四值语法?
- jQuery 插件
- dotnet 基于 dotnet format 的 GitHub Action 自动代码格式化机器人
- 10.7 border-width边框粗细:outline与border有什么不同?
- WPF 非客户区的触摸和鼠标点击响应
- Flink 解决 No ExecutorFactory found to execute the application
- 10.8 如何用js验证一下boz-sizing样式对块级盒子大小的影响?