loj #6250. 「CodePlus 2017 11 月赛」找爸爸
#6250. 「CodePlus 2017 11 月赛」找爸爸
题目描述
小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对。
小 A 有一套自己的 DNA 序列比较方法,其最终目标是最大化两个 DNA 序列的相似程度,具体步骤如下:
- 给出两个 DNA 序列,第一个长度为 nnn,第二个长度为 mmm。
- 在两个序列的任意位置插入任意多的空格,使得两个字符串长度相同。
- 逐位进行匹配,如果两个序列相同位置上的字符都不是空格,假设第一个是 xxx,第二个是 yyy,那么他们的相似程度由 d(x,y)d(x,y)d(x,y) 定义。对于两个序列中任意一段极长的长度为 kkk的连续空格,我们定义这段空格的相似程度为 g(k)=−A−B(k−1)g(k)=-A-B(k-1)g(k)=−A−B(k−1)。
那么最终两个序列的相似程度就是所有的 d(x,y)d(x,y)d(x,y) 加上所有的极长空格段的相似程度之和。
现在小 A 通过某种奥妙重重的方式得到了小 B 的 DNA 序列中的一段,他想请你帮他算一下小 A 的 DNA 序列和小 B 的 DNA 序列的最大相似程度。
输入格式
输入第 111 行一个字符串,表示小 A 的 DNA 序列。
输入第 222 行一个字符串,表示小 B 的 DNA 序列。
接下来 444 行,每行 444 个整数,用空格隔开,表示 ddd 数组,具体顺序如下所示。
d(A,A)d(A,A)d(A,A) d(A,T)d(A,T)d(A,T) d(A,G)d(A,G)d(A,G) d(A,C)d(A,C)d(A,C)
d(T,A)d(T,A)d(T,A) d(T,T)d(T,T)d(T,T) d(T,G)d(T,G)d(T,G) d(T,C)d(T,C)d(T,C)
d(G,A)d(G,A)d(G,A) d(G,T)d(G,T)d(G,T) d(G,G)d(G,G)d(G,G) d(G,C)d(G,C)d(G,C)
d(C,A)d(C,A)d(C,A) d(C,T)d(C,T)d(C,T) d(C,G)d(C,G)d(C,G) d(C,C)d(C,C)d(C,C)
最后一行两个用空格隔开的正整数 A,BA,BA,B,意义如题中所述。
输出格式
输出共一行,表示两个序列的最大相似程度。
样例
样例输入
ATGG
ATCC
5 -4 -4 -4
-4 5 -4 -4
-4 -4 5 -4
-4 -4 -4 5
2 1
样例输出
4
样例解释
首先,将序列补成如下形式(- 代表空格)
ATGG--
AT--CC
然后所有 d(x,y)d(x,y)d(x,y) 的和为 d(A,A)+d(T,T)=10d(A,A)+d(T,T)=10d(A,A)+d(T,T)=10,所有极长连续空格段的相似程度之和为 g(2)+g(2)=−6g(2)+g(2)=-6g(2)+g(2)=−6。总和为 444,可以验证,这是相似程度最大的情况。
数据范围与提示
对于所有测试点,有 0<B<A≤1000,−1000≤d(x,y)≤1000,d(x,y)=d(y,x)0< B<A \le 1000, -1000\le d(x,y)\le 1000,d(x,y)=d(y,x)0<B<A≤1000,−1000≤d(x,y)≤1000,d(x,y)=d(y,x),序列只包含 {A,T,G,C}\{\text{A},\text{T},\text{G},\text{C}\}{A,T,G,C} 四种字符。
| 测试点编号 | n+mn + mn+m 的范围 | 特殊约定 |
|---|---|---|
| 1 | n=m=1n = m = 1n=m=1 | 无特殊要求 |
| 2 | n+m≤15n + m \leq 15n+m≤15 | |
| 3 | n+m≤300n + m \leq 300n+m≤300 | |
| 4 | ||
| 5 | n+m≤3000n + m \leq 3000n+m≤3000 | 序列中只包含一种字符 |
| 6 | 无特殊要求 | |
| 7 | ||
| 8 | ||
| 9 | ||
| 10 |
来自 CodePlus 2017 11 月赛,清华大学计算机科学与技术系学生算法与竞赛协会 荣誉出品。
Credit:idea/邢健开 命题/邢健开 验题/陈宇
Git Repo:https://git.thusaac.org/publish/CodePlus201711
感谢腾讯公司对此次比赛的支持。
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1010
using namespace std;
char s1[maxn],s2[maxn];
int l1,l2,A,B,a[maxn],b[maxn],d[][];
void work1(){
int ans=d[a[]][b[]];
ans=max(ans,-A);
printf("%d",ans);
}
int main(){
scanf("%s%s",s1+,s2+);
l1=strlen(s1+);l2=strlen(s2+);
for(int i=;i<=l1;i++){
if(s1[i]=='A')a[i]=;
if(s1[i]=='T')a[i]=;
if(s1[i]=='G')a[i]=;
if(s1[i]=='C')a[i]=;
}
for(int i=;i<=l2;i++){
if(s2[i]=='A')b[i]=;
if(s2[i]=='T')b[i]=;
if(s2[i]=='G')b[i]=;
if(s2[i]=='C')b[i]=;
}
for(int i=;i<=;i++)
for(int j=;j<=;j++)
scanf("%d",&d[i][j]);
scanf("%d%d",&A,&B);
if(l1==l2&&l1==){work1();return ;}
}
10分 手玩
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 3010
using namespace std;
char s1[maxn],s2[maxn];
int n,m,A,B,a[maxn],b[maxn],d[][],f[maxn][maxn][][];
void work(){
memset(f,-0x3f,sizeof(f));
f[][][][]=;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(i==j&&j==)continue;
if(i&&j){
f[i][j][][]=max(f[i][j][][],f[i-][j-][][]+d[a[i]][b[j]]);
f[i][j][][]=max(f[i][j][][],f[i-][j-][][]+d[a[i]][b[j]]);
f[i][j][][]=max(f[i][j][][],f[i-][j-][][]+d[a[i]][b[j]]);
}
if(i){
f[i][j][][]=max(f[i][j][][],f[i-][j][][]-B);
f[i][j][][]=max(f[i][j][][],f[i-][j][][]-A);
f[i][j][][]=max(f[i][j][][],f[i-][j][][]-A);
}
if(j){
f[i][j][][]=max(f[i][j][][],f[i][j-][][]-B);
f[i][j][][]=max(f[i][j][][],f[i][j-][][]-A);
f[i][j][][]=max(f[i][j][][],f[i][j-][][]-A);
}
}
}
}
int main(){
scanf("%s%s",s1+,s2+);
n=strlen(s1+);m=strlen(s2+);
for(int i=;i<=n;i++){
if(s1[i]=='A')a[i]=;
if(s1[i]=='T')a[i]=;
if(s1[i]=='G')a[i]=;
if(s1[i]=='C')a[i]=;
}
for(int i=;i<=m;i++){
if(s2[i]=='A')b[i]=;
if(s2[i]=='T')b[i]=;
if(s2[i]=='G')b[i]=;
if(s2[i]=='C')b[i]=;
}
for(int i=;i<=;i++)
for(int j=;j<=;j++)
scanf("%d",&d[i][j]);
scanf("%d%d",&A,&B);
work();
int ans=max(f[n][m][][],max(f[n][m][][],f[n][m][][]));
printf("%d",ans);
return ;
}
100分 动态规划
loj #6250. 「CodePlus 2017 11 月赛」找爸爸的更多相关文章
- [LOJ 6249]「CodePlus 2017 11 月赛」汀博尔
Description 有 n 棵树,初始时每棵树的高度为 H_i,第 i 棵树每月都会长高 A_i.现在有个木料长度总量为 S 的订单,客户要求每块木料的长度不能小于 L,而且木料必须是整棵树(即不 ...
- [LOJ 6248]「CodePlus 2017 11 月赛」晨跑
Description “无体育,不清华”.“每天锻炼一小时,健康工作五十年,幸福生活一辈子” 在清华,体育运动绝对是同学们生活中不可或缺的一部分.为了响应学校的号召,模范好学生王队长决定坚持晨跑.不 ...
- [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...
- LOJ6252. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡! 最短路+bitset
题目传送门 https://loj.ac/problem/6252 https://lydsy.com/JudgeOnline/problem.php?id=5109 题解 首先跑最短路,只保留 \( ...
- 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)
学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2 ...
- 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)
从S出发跑dij,从T出发跑dij,顺便最短路计数. 令$F(x)$为$S$到$T$最短路经过$x$的方案数,显然这个是可以用$S$到$x$的方案数乘$T$到$x$的方案数来得到. 然后第一个条件就变 ...
- 「CodePlus 2017 11 月赛」可做题
这种题先二进制拆位,显然改的位置只有每一段确定的数的开头和结尾,只需要对于每一个可决策位置都尝试一下填1和0,然后取min即可. #include<iostream> #include&l ...
- 「CodePlus 2017 11 月赛」Yazid 的新生舞会
n<=500000的数字,问有多少个区间的众数出现次数严格大于区间长度的一半. 这么说来一个区间就一个众数了,所以第一反应是枚举数字,对下标进行处理.然后没有第二反应.很好. 在枚举一个数字的时 ...
- 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!
n<=50000,m<=50000的图,给s和t,问有多少点对$(a,b)$满足 嗯. 不会. 首先最短路DAG造出来,然后两个条件转述一下:条件一,$N_a$表示从s到t经过a的路径,$ ...
随机推荐
- PostgreSQL 9.5 客户端认证
PostgreSQL 9.5 客户端认证 当一个客户端应用连接一个数据库服务器时,它将指定以哪个PostgreSQL 数据库用户名连接,就像我们以一个特定用户登录一台 Unix 计算机一样.在 SQL ...
- Git 之Windows环境下学习系列
Git .SVN .TFS 相同点 不同点 Git 版本控制 优点: 分布式版本控制.无需联网就能版本提交 开源 缺点 入门学习难度高 SVN 优点: 集中式版本控制. 个人开源 缺点 ...
- java--构造器与static
原本无显示编码构造器,则有一个默认的隐式(隐藏的无参构造器),但是,当显示指定了构造器,则这个默认隐式的构造器将不存在,比如此时无法new无参的构造器(除非显示地编写声明无参的构造函数). 如果子类构 ...
- jvm调优(二)
栈内存溢出,主要发生在大数据批量处理的情况,一般解决方案:1.加大栈内存 2.分批处理(用事物,全通过则通过,没有通过则回滚) cpu过高,死锁啊,内存过高啊,i/0问题啊 都可以看 线程栈 jsta ...
- 无人零售的黑科技:RFID技术
无人零售的黑科技:RFID技术说起最近的热门话题,“无人零售商店”当属其一.自去年底,亚马逊推出第一家无人实体超市Amazon Go,到阿里.京东.大润发等各大企业纷纷加入,无人商店被推上了风口浪尖. ...
- ABP工作单元
简介 Unit of work:维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决.即管理对象的CRUD操作,以及相应的事务与并发问题等.Unit of Work是用来解决领域模型存储和变 ...
- JavaScript实现重置表单(reset)的方法
转自:https://www.jb51.net/article/63305.htm <!DOCTYPE html> <html> <head> <script ...
- Android编译系统产品线
1.Android源码中的产品线解析 通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品.这就引入了产品线的概念.Android系统源码中,产品相关的 ...
- C语言学习笔记--#error 、 #line 和 #pragma 的使用
1. #error 的用法 (1)#error 是一种预编译器指示字,用于生成一个编译错误消息 (2)用法:#error message //注意:message 不需要用双引号包围 (3)#erro ...
- buntu下shell脚本运行异常:bash和…
转载于:http://www.51testing.com/?uid-225738-action-viewspace-itemid-208702 我用bash到语法写了一个shell脚本(准确的说是把书 ...