题目:

脱氧核糖核酸即常说的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. delphi提示错误行号之Assert(断言)

    一.用法:Assert(表达式)1.如果为假 Assert会产生一个EAssertionFailed异常,显示为 Assertion Failed (C:/src/unit1.pas, [size=+ ...

  2. TQMsgPack序列还原clientdataset.data

    序列 procedure TForm1.Button2Click(Sender: TObject);var msgpack: TQMsgPack;begin msgpack := TQMsgPack. ...

  3. ASP.NET MVC中Session以及处理方式

    转载原地址 http://www.cnblogs.com/darrenji/p/3951065.html

  4. viPlugin安装破解

    viPlugin是一个eclipse 针对vi的插件,使用此插件可以让你在使用eclipse进行编码时使用几乎所有vi命令,可以极大的提高开发编码效率.  安装  点击你的eclipse中的 help ...

  5. javascript操作Math对象的方法总结

    //数学函数--abs 返回数字的绝对值 var a; /*a = Math.abs(-12); alert(a); //12 //数学函数--acos 返回数的反余弦数 a = Math.acos( ...

  6. Java Nio 多线程网络下载

    --> 默认最多50个线程 同一文件下载失败延迟超过30秒就结束下载 --> 下载5分钟超时时间,假设5分钟内未下载完就结束下载 --> 依赖 commons-httpclient ...

  7. WCF 新手教程二

    基本知识: [ServiceContract] Attribute 能够有以下Property 的: CallbackContract 设置callback的类型:Duplicate指Service ...

  8. Codeforces Round #333 (Div. 1) C. Kleofáš and the n-thlon 树状数组优化dp

    C. Kleofáš and the n-thlon Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...

  9. Codeforces Round #331 (Div. 2)C. Wilbur and Points 贪心

    C. Wilbur and Points Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/596/ ...

  10. 对CAB文件进行数字签名

    对CAB文件进行数字签名 传说中数字签名之后就能够不出现提示而自己主动下载,所以也试试: 在\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin 中间有三个小 ...