POJ 1080 Human Gene Functions(DP:LCS)
2016-07-03 16:50
549 查看
题意:
人类基因有两条,现在给出两个字符串,有长有短,可以在字符串中插入空格,要求对照表使两个字符串得出的相似值最大。
要点:
是LCS的变形,用dp[i][j]存储第一个字符串前i个字符与第二个字符串前j个字符的相似值的最大值,可以这么理解,要么就两个字符串都不加空格,要么其中一个加一个不加。这样可以写出状态转移方程为:dp[i][j]=max(dp[i - 1][j - 1] + matrix[val[a[i]]][val[b[j]]],dp[i - 1][j] + matrix[val[a[i]]][val['-']], dp[i][j - 1] + matrix[val['-']][val[b[j]]])。这题的边界条件不太一样,除了dp[0][0]=0以外,其他的:dp[0][i]
= dp[0][i-1] + matrix[val['-']][val[b[i]]],dp[i][0] = dp[i-1][0] + matrix[val['-'] ][val[a[i]]]。可以这么理解,为0就是空格,也是有相似值的。
人类基因有两条,现在给出两个字符串,有长有短,可以在字符串中插入空格,要求对照表使两个字符串得出的相似值最大。
要点:
是LCS的变形,用dp[i][j]存储第一个字符串前i个字符与第二个字符串前j个字符的相似值的最大值,可以这么理解,要么就两个字符串都不加空格,要么其中一个加一个不加。这样可以写出状态转移方程为:dp[i][j]=max(dp[i - 1][j - 1] + matrix[val[a[i]]][val[b[j]]],dp[i - 1][j] + matrix[val[a[i]]][val['-']], dp[i][j - 1] + matrix[val['-']][val[b[j]]])。这题的边界条件不太一样,除了dp[0][0]=0以外,其他的:dp[0][i]
= dp[0][i-1] + matrix[val['-']][val[b[i]]],dp[i][0] = dp[i-1][0] + matrix[val['-'] ][val[a[i]]]。可以这么理解,为0就是空格,也是有相似值的。
15656931 | Seasonal | 1080 | Accepted | 272K | 16MS | C++ | 1032B | 2016-07-03 16:39:17 |
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> #include<map> using namespace std; int dp[200][200]; 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 } }; map<char, int> val; int main() { int i, j, t,len1,len2; val['A'] = 0; val['C'] = 1; val['G'] = 2; val['T'] = 3; val['-'] = 4; char a[200], b[200]; scanf("%d", &t); while (t--) { scanf("%d%s", &len1, a + 1); scanf("%d%s", &len2, b + 1); dp[0][0] = 0; for (i = 1; i <= len1; i++) dp[i][0] = dp[i-1][0] + matrix[val['-'] ][val[a[i]]]; for (i = 1; i <= len2; i++) dp[0][i] = dp[0][i-1] + matrix[val['-']][val[b[i]]]; for(i=1;i<=len1;i++) for (j = 1; j <= len2; j++) { dp[i][j] = dp[i - 1][j - 1] + matrix[val[a[i]]][val[b[j]]]; dp[i][j] = max(dp[i][j], dp[i - 1][j] + matrix[val[a[i]]][val['-']]); dp[i][j] = max(dp[i][j], dp[i][j - 1] + matrix[val['-']][val[b[j]]]); } printf("%d\n", dp[len1][len2]); } return 0; }
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- LFC1.0.0 版本发布
- ACM程序设计大赛题目分类
- Android dpi,dip,dp的概念以及屏幕适配
- 计算字符串最后一个单词长度
- Android px、dp、sp之间相互转换
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- 矩阵的乘法操作
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法