poj 1080 Human Gene Functions 解题报告(附详细分析)
2013-11-27 22:19
375 查看
动态规划题,是最长子序列的变形。
最优解是字符串对应值的最大值,只需要改一下最长子序列的动态转移方程即可。
解题思路
1.取字符i-1和j-1的时候dp[i][j]=dp[i-1][j-1]+value[s1[i-1]][s2[j-1]];
2.取字符i-1不取j-1的时候dp[i][j]=dp[i-1][j]+value[s1[i-1]]['-'];
3.取字符j-1不取i-1的时候dp[i][j]=dp[i][j-1]+value['-'][s2[j-1]];
最优解是字符串对应值的最大值,只需要改一下最长子序列的动态转移方程即可。
解题思路
1.取字符i-1和j-1的时候dp[i][j]=dp[i-1][j-1]+value[s1[i-1]][s2[j-1]];
2.取字符i-1不取j-1的时候dp[i][j]=dp[i-1][j]+value[s1[i-1]]['-'];
3.取字符j-1不取i-1的时候dp[i][j]=dp[i][j-1]+value['-'][s2[j-1]];
#include <iostream> using namespace std; const int MAX = 200; int max(int, int, int); int i, j; int dp[MAX][MAX]; char s1[MAX], s2[MAX]; int value[MAX][MAX]; int main() { value['A']['A']=value['C']['C']=value['G']['G']=value['T']['T']=5; value['A']['C']=value['C']['A']=value['A']['T']=value['T']['A']=-1; value['-']['T']=value['T']['-']=-1; value['A']['G']=value['G']['A']=value['C']['T']=value['T']['C']=-2; value['G']['T']=value['T']['G']=value['G']['-']=value['-']['G']=-2; value['A']['-']=value['-']['A']=value['C']['G']=value['G']['C']=-3; value['C']['-']=value['-']['C']=-4; //录入题目的表格 int t, m, n; scanf("%d", &t); while (t--) { scanf("%d%s", &n, s1+1); scanf("%d%s", &m, s2+1); memset(dp, 0, sizeof(dp)); dp[0][0] = 0; for(i = 1; i <= n; i++) dp[i][0] = dp[i-1][0] + value[s1[i]]['-']; //数组边界的初始化 for(j = 1; j <= m; j++) dp[0][j] = dp[0][j-1] + value['-'][s2[j]]; //当i=0时,表示第j个字母和‘-’匹配 for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) { dp[i][j] = max( dp[i-1][j-1] + value[s1[i]][s2[j]], dp[i][j-1] + value['-'][s2[j]], //表示s1[i]与s2[j-1]匹配,于是s2[j]就只能与‘-’匹配 dp[i-1][j] + value[s1[i]]['-'] ); //表示 s1[i-1] 与 s2[j] 匹配 于是 s1[i] 就只能和 ‘-’匹配 } printf("%d\n", dp [m]); } return 0; } int max(int a, int b, int c) { int m; if(a > b) m = a; else m = b; if(m < c) m = c; return m; }
相关文章推荐
- cookie学习笔记2
- 【第二章 第四节】
- 【第二章 第三节】
- 1066. Root of AVL Tree (25)
- 【第二章 第二节】
- 【算法导论】贪心算法之活动安排问题
- 电脑族最容易得什么疾病?
- 跟我来用cocos2d-x做一个游戏 Sky Defense
- 【算法导论】贪心算法之活动安排问题
- [linux Shell] 判断当前运行的参数的个数
- 【第二章 第一节】
- 【第二章】证券交易程序_整理
- 显式转换 id和void *
- Python字符与数字的相互转换
- 原来分屏这么容易
- 代理模式(接口和子类)
- windows server 2012之搭建域控制器DC
- 【第二章】证券交易程序
- 每日Ubuntu小技巧-更改Samba工作组和计算机名
- 每日Ubuntu小技巧-更改Samba工作组和计算机名