题目大意:每次给出两个碱基序列(包含ATGC的两个字符串),其中每一个碱基与另一串中碱基如果配对或者与空串对应会有一个分数(可能为负),找出一种方式使得两个序列配对的分数最大

思路:字符串动态规划的经典题,很容易想到状态dp[i][j],指第一个长度为i的串和第二个长度为j的串配对的最大分数。显然,这个状态可以由dp[i][j-1],dp[i-1][j],dp[i-1][j-1]三个子问题得到,即第一串最后一个字符对应空格、第二串最后一个字符对应空格和第一串第二串最后一个字符配对所得到的分数这三者的最大值。

方程:dp[i][j]=max{dp[i-1][j]+grade[i][grade],dp[i][j-1]+grade[space][j],dp[i-1][j-1]+grade[i][j]}

grade[i][j]指的是字符串1的第i个碱基和字符串2的第j个碱基配对的分数 space指配对空格的分数

code:

#include<cstdio>

#include<string.h>

#include<iostream>

using namespace std;

const int trans[10][10]=

{{0},{0,5,-1,-2,-1,-3},

{0,-1,5,-3,-2,-4},

{0,-2,-3,5,-2,-2},

{0,-1,-2,-2,5,-1},

{0,-3,-4,-2,-1,-19941117}//我竟然和杜宇飞神犇生日同一天!!以后无穷大就用它了

};

int tr(char ch)

{

if (ch=='A')return 1;if (ch=='C')return 2;

if (ch=='G')return 3;if (ch=='T')return 4;

return 0;

}

int max(int a,int b,int c)

{

if (a<b)a=b;

if (a<c)a=c;

return a;

}

int main()

{

int t,gene1[200]={0},gene2[200]={0},n1,n2,dp[200][200]={{0}};

scanf("%d",&t);

char ch1[200],ch2[200];

for(int k=1;k<=t;k++)

{

memset(dp,0,sizeof(dp));

scanf("%d",&n1);

scanf("%s",ch1);

for(int i=1;i<=n1;i++)

{

gene1[i]=tr(ch1[i-1]);

}

scanf("%d",&n2);

scanf("%s",ch2);

for(int i=1;i<=n2;i++)

{

gene2[i]=tr(ch2[i-1]);

}

for(int i=1;i<=n1;i++)dp[i][0]=dp[i-1][0]+trans[gene1[i]][5];

for(int i=1;i<=n2;i++)dp[0][i]=dp[0][i-1]+trans[gene2[i]][5];

for(int i=1;i<=n1;i++)

{

for(int j=1;j<=n2;j++)

{

dp[i][j]=max(dp[i-1][j]+trans[gene1[i]][5],

dp[i][j-1]+trans[gene2[j]][5],

dp[i-1][j-1]+trans[gene1[i]][gene2[j]]);

}

}

printf("%d\n",dp[n1][n2]);

}

return 0;

}

调试结果:2WA 原因:一开始看discuss里别人犯错的原因:矩阵抄错、dp方程写错、数组写小了.....一个个对下来好像都没错,从头到尾看了两遍才发现dp的初始条件写错了,这样竟然都能过样例太坑了!!看来以后自己构造边缘数据测试程序鲁棒性的能力得加强!!

【BTW】貌似比较正规的解题报告就是从这篇开始的(正规是指题目大意,算法,code以及附加)

POJ 1080 Human Gene Functions 【dp】的更多相关文章

  1. poj 1080 ——Human Gene Functions——————【最长公共子序列变型题】

    Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17805   Accepted:  ...

  2. poj 1080 Human Gene Functions(lcs,较难)

    Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19573   Accepted:  ...

  3. poj 1080 Human Gene Functions(dp)

    题目:http://poj.org/problem?id=1080 题意:比较两个基因序列,测定它们的相似度,将两个基因排成直线,如果需要的话插入空格,使基因的长度相等,然后根据那个表格计算出相似度. ...

  4. POJ 1080 Human Gene Functions -- 动态规划(最长公共子序列)

    题目地址:http://poj.org/problem?id=1080 Description It is well known that a human gene can be considered ...

  5. dp poj 1080 Human Gene Functions

    题目链接: http://poj.org/problem?id=1080 题目大意: 给两个由A.C.T.G四个字符组成的字符串,可以在两串中加入-,使得两串长度相等. 每两个字符匹配时都有个值,求怎 ...

  6. hdu 1080 Human Gene Functions(DP)

    题意: 人类基因由A.C.G.T组成. 有一张5*5的基因表.每格有一个值,叫相似度.例:A-C:-3.意思是如果A和C配对, 则它俩的相似度是-3[P.S.:-和-没有相似度,即-和-不能配对] 现 ...

  7. POJ 1080 Human Gene Functions

    题意:给两个DNA序列,在这两个DNA序列中插入若干个'-',使两段序列长度相等,对应位置的两个符号的得分规则给出,求最高得分. 解法:dp.dp[i][j]表示第一个字符串s1的前i个字符和第二个字 ...

  8. poj 1080 Human Gene Functions (最长公共子序列变形)

    题意:有两个代表基因序列的字符串s1和s2,在两个基因序列中通过添加"-"来使得两个序列等长:其中每对基因匹配时会形成题中图片所示匹配值,求所能得到的总的最大匹配值. 题解:这题运 ...

  9. 【HDOJ】1080 Human Gene Functions

    DP.wa了一下午,原来是把mmax写在外层循环了.最近事情太多了,刷题根本没状态. #include <cstdio> #include <cstring> #include ...

随机推荐

  1. xcode6的项目中虚拟键盘无法弹出

    这是因为Xcode6中的模拟器键盘设置跟之前的版本不一样了.之前版本是模拟器的键盘和电脑的键盘都可以使用,但是Xcode6的模拟器键盘只能使用一种,即要么是模拟器键盘,要么是电脑键盘.快捷键切换键盘类 ...

  2. Android系统级技巧合集

    Android系统级技巧合集(随时更新) #转载请注明来源# 1.高通骁龙系列查看CPU体质等级 CPU体质,即为CPU在工作频率下的电压.同一批次的CPU体质各有不同,体质越高,代表该颗CPU可在更 ...

  3. cluvfy comp命令用法

    1.获取集群验证工具cluvfy的帮助信息 grid@rac1:/home/grid>cluvfy -help USAGE: cluvfy [ -help ] cluvfy stage { -l ...

  4. js 输出某年某月某日的天数/判断闰年

    console.log(getDays(2017,12,12)); function getDays(year,month,day){ var arr = [31,28,31,30,31,30,31, ...

  5. Linux之用户权限管理

    chmod(更改目录或文件权限) 在linux中,文件的权限分为3中,拥有者,群组,其他人.而chmod则是对权限更改的命令. u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个组,o 表示其 ...

  6. uva820 Internet Bandwidth

    就是模板... #include<cstdio> #include<cstring> #include<vector> #include<queue> ...

  7. zabbix设置多个收件人

    1.建群组   2.添加群组权限   3.添加用户,归属到上面新建的组   4.动作里发送消息给新建的组   5.这样设置后,管理员账号不用设置收件媒介  

  8. css实现水平/垂直居中效果

    一.如果是已知宽高的元素做水平/垂直居中效果的话,可以直接用具体的数值指定定位布局或偏移布局,这个就不过多讨论.这里主要介绍在不知宽高或需要弹性布局下的几种实现方式. 二.1.table表格法思路:显 ...

  9. docker 离线安装

    适用于: 1.内网安装docker 2.内网升级docker debian 8 sudo apt-get updatesudo apt-get install -d apt-transport-htt ...

  10. js div大小随意伸缩

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...