Huaman Gene Functions
来源:互联网 发布:multisim 网络标号 编辑:程序博客网 时间:2024/06/03 05:28
算法分析:
/*
分析此问题可知,为最长子序列(LCS)问题的变形。假设两个子序列分别是X,Y;
Xi=(x1,x2...xi),Yj=(y1,y2..yj)分别是两个子序列的前i,j个子序列
求最长子序列;
1、当xi=yj时,dp[i][j]=dp[i-1][j-1]+1
2、当xi!=yj时,则dp[i][j]=max(dp[i-1][j],dp[i][j-1]).
对于本题来说是变种LCS.
设dp[i][j]为取s1第i个字符,s2第j个字符时的最大分值
则决定dp为最优的情况有三种(matrix[][]为s1[i]和s2[j]两符号的分数):
1、 s1取第i个字母,s2取“ - ”: dp[i-1][j]+matrix[ s1[i] ]['-'];
2、 s1取“ - ”,s2取第j个字母:dp[i][j-1]+matrix['-'][ s2[j] ];
3、 s1取第i个字母,s2取第j个字母:dp[i-1][j-1]+matrix[ s1[i] ][ s2[j] ];
即dp[i][j]=max( dp[i-1][j]+matrix[ s1[i] ]['-'],
dp[i][j-1]+matrix['-'][ s2[j] ],
dp[i-1][j-1]+matrix[ s1[i] ][ s2[j] ] );
初始化:
1、dp[0][0]=0;
2、dp[i][0](i属于(1,s1.length))
dp[i][0]=matrix[s1[i]]['-'];
dp[0][j](j属于(1,s2.length))
dp[0][j]=matrix['-'][s2[j]]
注:matrix[][]可以定义为int型的数组,此处只是为了方便描述而将数组维数值用字符来代替。
*/
#include <iostream>#include <stdio.h>#include <string.h>#define MAXVALUE 101using namespace std;int switchint(char t){ if(t=='A') return 0; if(t=='C') return 1; if(t=='G') return 2; if(t=='T') return 3; if(t=='-') return 4;}int getmaxs(int x,int y,int z){ int temp; if(x>y) temp=x; else temp=y; return temp>z? temp:z;}int main(){ int length1,length2; //分别记录s1和s2序列长度 int times;//循环次数 char s1[MAXVALUE]; char s2[MAXVALUE]; int dp[MAXVALUE][MAXVALUE];//用来记录总长子列长度 //首先我们先创建一个matrix二维整形数组来记录score int matrix[5][5]= { 5,-1,-2,-1,-3, -1,5,-3,-2,-4, -2,-3,5,-2,-2, -1,-2,-2,5,-1, -3,-4,-2,-1,0 }; // *我们用0来表示 //此函数用来将字符转换成整形数值,目的是方便构建matrix整形数组 cin>>times; while(times--) { cin>>length1; for(int i=1;i<=length1;i++) cin>>s1[i]; cin>>length2; for(int i=1;i<=length2;i++) cin>>s2[i]; // #region 初始化 memset(dp, 0, sizeof (dp)); for(int i=1;i<=length1;i++) { int temp=switchint(s1[i]); dp[i][0]=dp[i-1][0]+matrix[temp][4]; } for(int j=1;j<=length2;j++) { int temp=switchint(s2[j]); dp[0][j]=dp[0][j-1]+matrix[4][temp]; } //#endregion for(int i=1;i<=length1;i++) { for(int j=1;j<=length2;j++) { //dp[i][j]=max(dp[i-1][j-1]+matrix[switchint(s1[i])][switchint(s2[j])],dp[i-1][j]+matrix[switchint(s1[i])][4],dp[i][j-1]+matrix[4][switchint(s2[j])]); int t1=dp[i-1][j-1]+matrix[switchint(s1[i])][switchint(s2[j])]; int t2=dp[i-1][j]+matrix[switchint(s1[i])][4]; int t3=dp[i][j-1]+matrix[4][switchint(s2[j])]; dp[i][j]=getmaxs(t1,t2,t3); } } cout<<dp[length1][length2]<<endl; //delete []dp; } return 0;}
1 0
- Huaman Gene Functions
- zoj1027 Human Gene Functions
- 1080 Human Gene Functions
- PKU1080 Human Gene Functions
- Human Gene Functions(POJ1080)
- POJ_1080_Human Gene Functions
- Human Gene Functions
- Human Gene Functions
- ZOJ1027 Human Gene Functions
- ZOJ1027 POJ1080Human Gene Functions
- pku1080 Human Gene Functions
- Human Gene Functions
- poj1080 - Human Gene Functions
- hdu Human Gene Functions
- 1080--Human Gene Functions
- POJ1080-Human Gene Functions
- POJ1080--Human Gene Functions
- poj1080 Human Gene Functions
- Android Studio绝对实用的新手教程(1)导入第三方包或者运行eclipse项目
- Unity之基础查询,连接数据库
- 指针逆序输出数组
- 第16周OJ-指针(4)
- Android中ListView.getCount()与ListView.getChildCount()区别和OnScrollListener()各个参数的区别
- Huaman Gene Functions
- Unity3D之高级查询
- 虚函数底层实现机制
- 转载一篇LDA算法使用总结
- CSS盒模型--边框设置:border: 1px solid red(像素 样式 颜色 ),border-bottom:1px dotted #ccc
- JavaScript表单项数据过滤代码
- java 多线程之主线程与子线程
- Unity3D之增,减,删,改方法
- Unity骑士团培训心得