题意:
给两串DNA序列,按照给定的方法找他们最大的相似度。比如序列AGTGATG和GTTAG,化为AGTGATG和-GTTA-G,相似度最大,为14。
思路:
由低到高的往上递推,动态规划。
设dp(i,j)为第一个序列(s1)的前i个数和第二个序列(s2)的前j个数的相似度的最大值。当s1[i-1]==s2[j-1]时,由题目给出的表显然可以得出dp(i,j)=dp(i-1,j-1)+p[s1[i-1]][s2[j-1]];score数组为题目中给出的那个表格。当s1[i-1]!=s2[j-1]时,反证法显然有dp(i,j)=max(d(i-1,j)+score[s1[i-1]]['-'],dp(i,j-1)+score['-'][],d(i-1,j-1)+score[s1[i-1]][s2[j-1]])。于是,两个for就解决问题了。注意初始化数组。
代码如下:
#include<iostream>
using namespace std;
const int inf=-5; //无穷小
int score['T'+1]['T'+1]; //积分表
void initial(void) //打表
{
score['A']['A']=5;
score['C']['C']=5;
score['G']['G']=5;
score['T']['T']=5;
score['-']['-']=inf;
score['A']['C']=score['C']['A']=-1;
score['A']['G']=score['G']['A']=-2;
score['A']['T']=score['T']['A']=-1;
score['A']['-']=score['-']['A']=-3;
score['C']['G']=score['G']['C']=-3;
score['C']['T']=score['T']['C']=-2;
score['C']['-']=score['-']['C']=-4;
score['G']['T']=score['T']['G']=-2;
score['G']['-']=score['-']['G']=-2;
score['T']['-']=score['-']['T']=-1;
return;
}
int max(int a,int b,int c)
{
int k=(b>c?b:c);
return a>k?a:k; //注意求三个数最大值时,a>b?a:(b>c?b:c)在C++中是错误的
} //b的值没有因为(b>c?b:c)而改变,必须把三个数拆开求最大值
int main(int i,int j)
{
initial();
int test;
cin>>test;
while(test--)
{
/*Input*/
int len1,len2;
cin>>len1;
char* s1=new char[len1+1];
cin>>s1;
cin>>len2;
char* s2=new char[len2+1];
cin>>s2;
int **dp=new int*[len1+1]; //申请动态二维数组,第一维
dp[0]=new int[len2+1];
/*Initial*/
dp[0][0]=0;
for(i=1;i<=len1;i++)
{
dp[i]=new int[len2+1]; //申请动态二维数组,第二维
dp[i][0]=dp[i-1][0]+score[ s1[i-1] ]['-']; //注意下标,dp数组是从1开始,s1和s2都是从0开始
}
for(j=1;j<=len2;j++)
dp[0][j]=dp[0][j-1]+score['-'][ s2[j-1] ];
/*Dp*/
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
{
int temp1=dp[i-1][j]+score[ s1[i-1] ]['-'];
int temp2=dp[i][j-1]+score['-'][ s2[j-1] ];
int temp3=dp[i-1][j-1]+score[ s1[i-1] ][ s2[j-1] ];
dp[i][j]=max(temp1,temp2,temp3);
}
cout<<dp[len1][len2]<<endl;
delete[] dp;
}
return 0;
}
分享到:
相关推荐
【标题】"POJ1080-Human Gene Functions"是一个编程挑战,源自北京大学的在线判题系统(POJ,即PKU Online Judge)。这个题目主要涉及到生物信息学中的基因功能预测,以及如何通过编程算法解决此类问题。 【描述】...
北大POJ1080-Human Gene Functions
- (poj3176, poj1080, poj1159):多维状态转移方程的应用。 ### 五、组合数学 1. **排列组合基础**: - 排列、组合的计算方法。 2. **多项式与快速幂**: - 多项式的运算规则以及快速幂算法。 3. **容斥原理*...
- POJ 3176、POJ 1080:复杂的状态空间定义与状态转移。 ### 数学问题 #### 组合数学 - **题目示例**: - POJ 3252、POJ 1850:组合数学原理的应用。 - POJ 1019、POJ 1942:组合计数问题。 #### 几何问题 - *...
- 推荐题目:[poj3176](https://vjudge.net/problem/POJ-3176)、[poj1080](https://vjudge.net/problem/POJ-1080)、[poj1159](https://vjudge.net/problem/POJ-1159) - 组合计数问题需要熟练掌握排列组合的基本...
2. **线段交**:计算线段是否相交及交点位置(poj3176, poj1080, poj1159)。 ### 七、概率统计 1. **概率计算**:计算随机事件的概率(POJ3252, poj1850, poj1019, poj1942)。 2. **期望值**:计算期望值问题...
5. POJ 1080 - 1088: 随着编号接近尾声,题目难度可能更大,可能涵盖高级数据结构(如二叉堆、红黑树)或复杂算法(如最小生成树、拓扑排序)。解这些题目需要扎实的理论基础和良好的问题解决能力。 这些源码提供了...
- poj1080 - poj1159 - **应用场景**:适用于路径规划、编辑距离计算等问题。 #### 六、数学 **1. 组合数学** - **定义**:研究离散对象的计数方法。 - **示例题目**: - poj1809 - poj3252 - poj1850 - poj...
- **题目5**:如POJ1080,可能涉及到图论的基本概念,如邻接矩阵、深度优先搜索(DFS)等。 - **题目6**:如POJ1221,可能考查动态规划思想,如背包问题、最长公共子序列等经典问题。 综上所述,POJ推荐50题不仅是...
* 最长公共子序列:poj3176, poj1080, poj1159 * 最优二分检索树问题 六、数学 * 组合数学: + 加法原理和乘法原理 + 排列组合 + 递推关系 - poj3252, poj1850, poj1019, poj1942 * 数论: + 素数与整除问题...
3. 最长公共子序列:如poj3176、poj1080等。 4. 最优二分检索树问题:如poj1159。 六、数学 1. 组合数学:加法原理、乘法原理、排列组合和递推关系,如poj3252、poj1850等。 2. 数论:素数、整除、进制位和同余模...
poj1837和poj1276是背包问题的实例,而型如下表的简单DP问题,如poj3267、poj1836、poj1260和poj2533,以及最长公共子序列问题(如poj3176、poj1080和poj1159)都是动态规划的典型应用。 六、数学 数学在编程竞赛中...
- **最长公共子序列**:如 poj3176、poj1080。 6. **数学**: - **组合数学**: - 加法和乘法原理。 - 排列组合。 - 递推关系。 - **数论**: - 素数与整除问题。 - 进制位运算。 - 同余模运算。 - **...
- **示例题目**: POJ 3267, POJ 1836, POJ 1260, POJ 2533, POJ 3176, POJ 1080, POJ 1159 - **注意事项**: 理解每种模型的状态定义和转移方程。 #### 六、数学 **1. 组合数学** - **定义**: 研究组合结构的...
- POJ 1080: 编辑距离的变种 - POJ 1159: 编辑距离的复杂案例 #### 三、组合数学 组合数学主要涉及计数组合、排列组合等问题。 - **组合数**:掌握组合数的计算公式及其应用。 - **示例题目**: - POJ 3252: ...
1080 POJ 1159 POJ 2533 POJ 1836 Leetcode 70 Leetcode 309 搜索 DFS POJ 2488 POJ 3083 POJ 3009 POJ 1321 BFS POJ 3278 POJ 1426 POJ 3126 POJ 3414 POJ 2251 简单搜索技巧和剪枝 POJ 1010 :star: POJ 2362 POJ ...
4. poj_1080.c - "Multiplication Table":该题要求生成乘法表,是基础的字符串处理和循环控制的应用,适合巩固基础知识。 5. poj_1002.c - "Addition":这是最基础的加法问题,虽然简单,但却是所有计算的基础,...
### poj dp总结:动态规划分类 #### 概述 动态规划(Dynamic Programming,简称DP)是一种在计算机科学和数学中广泛使用的算法策略,用于解决最优化问题。它通过将复杂问题分解为较简单的子问题来求解,并利用这些...
poj经典动态规划题目解题报告,包括经典的动态规划题目20多道,可以作为学习动态规划系统的资料,包括题目: Pku acm 1179 Polygon Pku acm 1125 Stockbroker Grapevine Pku acm 1160 post office Pku ...
- **1141**、**1050** 和 **1080** 这三道题目则可以帮助进一步巩固动态规划的基础知识。 - **1221** 和 **1260** 两题对于提高动态规划的熟练度有很好的作用。 - **2411** 是一道稍微困难一些的题目,适合那些想要...