DNA 基因的匹配

/*/* Name: DNA 基因的匹配 Copyright: mahan Author: CoolPrince Date: 16-07-09 16:19 Description: DNA 基因的匹配问题实质最原始的模型是求解最大字符串匹配度 在本题中运用的动态规划思想的 一个基因的选择与否来源与三种情况 1:来源于 a 以及b 2:来源于 a 以及加的 模糊的'-' 基因 3:来源于 b 以及加的 模糊的'-' 基因 比较三种情况选择匹配最优化的结果进行保存 首先需要处理出口的问题: 情况1:当两个 都没有的时候显然 基因的最优化的组合是不存在的也 就是说,匹配的大小是0 情况2:当两个基因只有一个存在时匹配只要以一个为基准对应的 依次加入单个基因就行 情况3:当两个基因都存在就 利用动态规划的基本思想从局部到整体考虑,最优匹配原则进行匹配 约束范围: 0<=i<=aLen ,0<=j<=bLen 动态方程是: f[i][j]= max{f[i-1][j-1]+g[aa[i]][bb[j]], f[i][j-1]+g[4][bb[j]],f[i-1][j]+g[aa[i]][4]}; */ #include #include #include using namespace std; const int g[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 }; int getmax(int a,int b) { if(a>b) return a; return b; } void dp(string a,string b ,int aLen,int bLen) { int f[101][101] ; int aa[101]; int bb[101]; for(int i = 1;i<=aLen;i++) { switch(a[i-1]) { case 'A': aa[i] = 0; break; case 'C': aa[i] = 1; break; case 'G': aa[i] = 2; break; case 'T': aa[i] = 3; break; case '-': aa[i] = 4; break; } } for(int i = 1;i<=bLen;i++) { switch(b[i-1]) { case 'A': bb[i] = 0; break; case 'C': bb[i] = 1; break; case 'G': bb[i] = 2; break; case 'T': bb[i] = 3; break; case '-': bb[i] = 4; break; } } //当没有字符串输入的时候将其置为0 f[0][0] = 0; // 当第二个数组的长度为0 时 只要将第一串的字符找最大DNA匹配 for(int i =1;i<=aLen;i++) { f[i][0] = f[i-1][0]+g[aa[i]][4]; } // 当第一个数组的长度为0 时 只要将第一串的字符找最大DNA匹配 for(int j = 1;j<= bLen;j++) f[0][j] = f[0][j-1]+ g[4][bb[j]]; int x,y,z; for(int i = 1;i<=aLen;i++) { for(int j = 1;j<=bLen;j++) { //当选择a[i] b[j]匹配时的大小 x = f[i-1][j-1]+g[aa[i]][bb[j]]; // 当a不选择而b选择与 '-' 匹配的时候 的大小 y = f[i][j-1]+g[4][bb[j]]; // 当a不选择而b选择与 '-' 匹配的时候的大小 z = f[i-1][j]+g[aa[i]][4]; //在三种匹配情况下选择最大的匹配存放到f[i][j]; f[i][j]= getmax(getmax(x,y),z); } } printf("%d/n",f[aLen][bLen]); } int main() { int aLen = 0; int bLen = 0; int t; string a; string b; cin>>t; for(int k = 0;k>a; scanf("%d",&bLen); cin>>b; dp(a,b,aLen,bLen); } return 0; }  

你可能感兴趣的:(算法设计与分析)