poj 1080 human gene functions

来源:互联网 发布:java 单例设计模式 编辑:程序博客网 时间:2024/05/09 19:30

根据算法导论上面的思想来做,采用LCS的思想,但是在这里需要变换一下状态转移方程

这个跟核苷所占得比重有关系了

状态转移方程为:

c[i][j]=max(c[i-1][j-1]+value(a[i],b[j]),c[i-1][j]+value(a[i],'-'),c[i][j-1]+value('-',b[j]))

比较难的是边界条件的处理,这一点在源程序中将会有体现

#include<stdio.h>char a[105],b[105];int c[105][105];int value(char a,char b){int ret;switch(a){case 'A':{if(b=='A')ret=5;else if(b=='C')ret=-1;else if(b=='G')ret=-2;else if(b=='T')ret=-1;else if(b=='-')ret=-3;}break;case 'C':{if(b=='A')ret=-1;else if(b=='C')ret=5;else if(b=='G')ret=-3;else if(b=='T')ret=-2;else if(b=='-')ret=-4;}break;case 'G':{if(b=='A')ret=-2;else if(b=='C')ret=-3;else if(b=='G')ret=5;else if(b=='T')ret=-2;else if(b=='-')ret=-2;}break;case 'T':{if(b=='A')ret=-1;else if(b=='C')ret=-2;else if(b=='G')ret=-2;else if(b=='T')ret=5;else if(b=='-')ret=-1;}break;case '-':{if(b=='A')ret=-3;else if(b=='C')ret=-4;else if(b=='G')ret=-2;else if(b=='T')ret=-1;}break;}return ret;}int max(int a,int b,int c){int max=a;if(max<b)max=b;if(max<c)max=c;return max;}int main(){int T;scanf("%d",&T);while(T--){int m,n,i,j;scanf("%d%s",&m,a);scanf("%d%s",&n,b);for(i=m-1;i>=0;i--)a[i+1]=a[i];for(j=n-1;j>=0;j--)b[j+1]=b[j];c[0][0]=0;for(i=1;i<=m;i++)         //这个地方的边界条件处理需要重视c[i][0]=value(a[i],'-')+c[i-1][0];for(j=1;j<=n;j++)c[0][j]=value('-',b[j])+c[0][j-1];for(i=1;i<=m;i++)for(j=1;j<=n;j++)c[i][j]=max(c[i-1][j-1]+value(a[i],b[j]),c[i-1][j]+value(a[i],'-'),c[i][j-1]+value('-',b[j]));printf("%d\n",c[m][n]);}return 0;}


原创粉丝点击