题目:

脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子。它由4种主要的脱氧核苷酸(dAMP、dGMP、dCMT和dTMP)通过磷酸二酯键连接而成。这4种核苷酸可以分别记为:A、G、C、T。

DNA携带的遗传信息可以用形如:AGGTCGACTCCA.... 的串来表示。DNA在转录复制的过程中可能会发生随机的偏差,这才最终造就了生物的多样性。

为了简化问题,我们假设,DNA在复制的时候可能出现的偏差是(理论上,对每个碱基被复制时,都可能出现偏差):

  1. 漏掉某个脱氧核苷酸。例如把 AGGT 复制成为:AGT

2. 错码,例如把 AGGT 复制成了:AGCT

3. 重码,例如把 AGGT 复制成了:AAGGT

如果某DNA串a,最少要经过 n 次出错,才能变为DNA串b,则称这两个DNA串的距离为 n。

例如:AGGTCATATTCC 与 CGGTCATATTC 的距离为 2

你的任务是:编写程序,找到两个DNA串的距离。

【输入、输出格式要求】

用户先输入整数n(n<100),表示接下来有2n行数据。

接下来输入的2n行每2行表示一组要比对的DNA。(每行数据长度<10000)

程序则输出n行,表示这n组DNA的距离。

例如:用户输入:

3

AGCTAAGGCCTT

AGCTAAGGCCT

AGCTAAGGCCTT

AGGCTAAGGCCTT

AGCTAAGGCCTT

AGCTTAAGGCTT

则程序应输出:

1

1

2

我的解答如下:

动态方程:如果str1[i]==str2[j],dp[i][j]=Min(dp[i-1][j-1],dp[i][j-1]+1,dp[i-1][j]+1);

     如果str1[i]!=str2[j],dp[i][j]=Min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;

前段时间贴的代码有错,现在改过来了

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[][];
int Min(int a,int b,int c)
{
int temp;
temp=a<b?a:b;
return temp<c?temp:c;
}
void init()
{
int i,j;
memset(dp,,sizeof(dp));
for(i=;i<=;i++)
dp[][i]=i;
}
int main()
{
char str1[],str2[];
int i,j;
int T;
scanf("%d",&T);
while(T--)
{
init();
scanf("%s%s",&str1,&str2);
int l1,l2;
l1=strlen(str1);
l2=strlen(str2);
int now=,pre=;
for(i=;i<l1;i++)//求最长公共子序列的思想。
{
now^=;
pre^=;
dp[now][]=i+;
for(j=;j<l2;j++)
{ if(str1[i]==str2[j])
dp[now][j+]=Min(dp[pre][j],dp[pre][j+]+,dp[now][j]+);
else
dp[now][j+]=Min(dp[pre][j+],dp[now][j],dp[pre][j])+;
}
}
printf("%d\n",dp[now][l2]);
}
return ;
}

最后一题解答:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[][];
int num[][];
char H[];
int ff=;
int n=;
void dfs(int x,int y)
{
int i,j;
if(x==)
{
ff=;
cout<<n++<<endl;
for(i=;i<=;i++)
{ for(j=;j<=;j++)
{
printf("%c",H[map[i][j]]);
}
printf("\n");
}
return ;
}
int div=num[x][y];
int f=;
if(map[x][y]==-)
for(i=;i<=;i++)
{
f=;
for(j=;j<;j++)
if(map[j][y]==i)
{f=;break;}
for(j=;j<;j++)
if(map[x][j]==i)
{f=;break;}
for(j=;j<=;j++)
for(int k=;k<=;k++)
if(num[j][k]==div&&map[j][k]==i)
{f=;break;}
if(f)
continue;
map[x][y]=i;
if(y<=)
dfs(x,y+);
else
dfs(x+,);
map[x][y]=-;
}
else
{
if(y<=)
dfs(x,y+);
else
dfs(x+,);
}
return ;
}
int pre[],now[];
void init()
{
memset(map,-,sizeof(map));
memset(num,-,sizeof(num));
H[]='A';
H[]='B';
H[]='C';
H[]='D';
H[]='E';
H[]='F';
ff=;
}
int main()
{
int i,j;
int T;
char str[];
init();
for(i=;i<=;i++)
{
scanf("%s",&str);
for(j=;j<=;j++)
num[i][j]=str[j]-'';
}
//cout<<"ok"<<endl;
scanf("%d",&T);
while(T--)
{
scanf("%s",&str);
map[str[]-''][str[]-'']=str[]-'A';
}
//cout<<"ok"<<endl;
dfs(,);
if(!ff)
printf("无解\n");
return ;
}

2012蓝桥杯C组本科决赛答案的更多相关文章

  1. java算法 第七届 蓝桥杯B组(题+答案) 4.分小组

    4.分小组  (代码填空) 9名运动员参加比赛,需要分3组进行预赛.有哪些分组的方案呢? 我们标记运动员为 A,B,C,... I下面的程序列出了所有的分组方法. 该程序的正常输出为:ABC DEF ...

  2. java算法 第七届 蓝桥杯B组(题+答案) 10.压缩变换

    10.压缩变换  (程序设计) 小明最近在研究压缩算法.他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比.然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些 ...

  3. java算法 第七届 蓝桥杯B组(题+答案) 9.取球博弈

    9.取球博弈  (程序设计) 两个人玩取球的游戏.一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目.如果无法继续取球,则游戏结束.此时,持有奇数个球的一方获胜.如果两人都是 ...

  4. java算法 第七届 蓝桥杯B组(题+答案) 8.四平方和

    8.四平方和  (程序设计) 四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.如果把0包括进去,就正好可以表示为4个数的平方和. 比如:5 = 0^2 + 0^2 + ...

  5. java算法 第七届 蓝桥杯B组(题+答案) 7.剪邮票

    7.剪邮票  (结果填空) 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红 ...

  6. java算法 第七届 蓝桥杯B组(题+答案) 6.方格填数

    6.方格填数  (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...

  7. java算法 第七届 蓝桥杯B组(题+答案) 5.抽签

    5.抽签  (代码填空) X星球要派出一个5人组成的观察团前往W星.其中:A国最多可以派出4人.B国最多可以派出2人.C国最多可以派出2人..... 那么最终派往W星的观察团会有多少种国别的不同组合呢 ...

  8. java算法 第七届 蓝桥杯B组(题+答案) 3.凑算式

    3.凑算式  (结果填空) B      DEFA + --- + ------- = 10     C      GHI         (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~ ...

  9. java算法 第七届 蓝桥杯B组(题+答案) 2.生日蜡烛

    2.生日蜡烛  (结果填空) 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛.现在算起来,他一共吹熄了236根蜡烛.请问,他从多少岁开始过生日party的?请填写他开 ...

随机推荐

  1. WinAPI: FindWindow、FindWindowEx - 查找窗口

    FindWindow(   lpClassName,        {窗口的类名}   lpWindowName: PChar {窗口的标题} ): HWND;              {返回窗口的 ...

  2. PicklingError: Can't pickle <type 'generator'>: it's not found as __builtin_

    多进程传递 参数时,需要是python系统已知的,不然不知道怎么序列化

  3. SQL Server中如何获取当前年,月,日,时,分,秒

    分类: SQL Server  select GETDATE() as '当前日期',DateName(year,GetDate()) as '年',DateName(month,GetDate()) ...

  4. c/c++字符串处理大集合

    rember this strncpy(a,b,5); a[5]='\0'; char a[10]; memset(a,'#',sizeof(a)); a[10]='\0'; 刚开始学C/C++时,一 ...

  5. JAVA 正则表达式 (超详细)

    (PS:这篇文章为转载,我不喜欢转载的但我觉得这篇文章实在是超赞了,就转了过来,这篇可以说是学习JAVA正则表达的必读篇.作者是个正真有功力的人,阅读愉快) 在Sun的Java JDK 1.40版本中 ...

  6. Volley使用指南第四回(来自developer.android)

    Volley网络请求的第四篇,废话不多说,开始. 这一篇文章将会教你怎样在Volley支持的范围内定制一个请求. 第一步:写一个通用请求: 大多数请求都有已经写好的接口供你调用,如果你的请求是Stri ...

  7. ubuntu 15.04开放mysql远程连接

    首先查看端口是否打开 netstat -an|grep 3306 此图为开启3306端口的截图,之前显示为. . . 127.0.0.1:3306 . . . 打开mysql配置文件vi /etc/m ...

  8. Educational Codeforces Round 2 E. Lomsat gelral 启发式合并map

    E. Lomsat gelral Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/600/prob ...

  9. java中的正则操作总结

    http://www.cnblogs.com/nerxious/archive/2013/01/03/2842910.html 正则表达式在处理字符串的效率上是相当高的 关于正则表达式的使用,更多的是 ...

  10. 解决mac的日历问题:服务器响应一个错误

    出了一个问题好久,平时也不用这个同步不靠谱的日历.今晚花点时间解决了下. 参考Apple 官网日历的问题解答. 当出现如下情况时: 退出日历和提醒事项. 从 Apple () 菜单中选取“系统偏好设 ...