洛谷OJ: P1140 相似基因(DP)

9人阅读 评论(0) 收藏 举报
分类:

思路:仍然是一道简单的DP,首先我们来分析一下有几种策略可以选择

1.令第一条链的碱基与空碱基配对

2.令第二条链的碱基与空碱基配对

3.令两条链的碱基相互配对

那么我们很容易就能够得到状态转移方程了,dp[i][j]表示第一条链的1~i部分与第二条链的1~j部分的最大匹配值

dp[i][j] = max{dp[i][j], dp[i-1][j]+a[i]与空碱基的匹配值, dp[i][j-1]+b[j]与空碱基的匹配值, dp[i-1][j-1]+a[i]与b[i]的匹配值}

因为i和j都要用到之前的状态,所以i和j都从1开始推

/**
 *	题目: 洛谷OJ:  P1140 相似基因(DP)
 *	题型: DP
 **/
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int maxn = 100+10;
const int w[6][6] = {{0,0,0,0,0,0},
			  	  	 {0,5,-1,-2,-1,-3},
					 {0,-1,5,-3,-2,-4},
					 {0,-2,-3,5,-2,-2},
				 	 {0,-1,-2,-2,5,-1},
					 {0,-3,-4,-2,-1,0}};
int dp[maxn][maxn], a[maxn], b[maxn], n, m;

int create() {
	char ch; 
	cin >> ch;
	switch(ch) {
		case 'A': return 1; 
		case 'C': return 2; 
		case 'G': return 3; 
		case 'T': return 4; 
	}
}

int main()  {
	/************input**************/
	cin >> n; for(int i = 1; i <= n; i++) a[i] = create();
	cin >> m; for(int i = 1; i <= m; i++) b[i] = create();
	/*******************************/
	
	/************init***************/ 
	//初始化工作一定要做好, 开始因为初始化疏忽大意WA了一个点 
	memset(dp, -0x3f, sizeof(dp));
	dp[0][0] = 0;
	for(int i = 1; i <= n; i++) dp[i][0] = dp[i-1][0] + w[a[i]][5];
	for(int i = 1; i <= m; i++) dp[0][i] = dp[0][i-1] + w[b[i]][5];
	/*******************************/
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			//为了方便阅读就不使用这种写法了 
			//dp[i][j] = max( dp[i][j], max( dp[i-1][j]+w[a[i]][5], max(dp[i][j-1]+w[b[j]][5], dp[i-1][j-1]+w[a[i]][b[j]]) ) );
			dp[i][j] = max(dp[i][j], dp[i-1][j]+w[a[i]][5]); //令a[i]与空碱基配对 
			dp[i][j] = max(dp[i][j], dp[i][j-1]+w[b[j]][5]); //令b[j]与空碱基配对
			dp[i][j] = max(dp[i][j], dp[i-1][j-1]+w[a[i]][b[j]]); //令a[i]与b[j]配对 
		}
	}
	cout << dp[n][m] << endl;
	return 0;
}

查看评论

洛谷 P1140 相似基因

动态规划
  • Rlt1296
  • Rlt1296
  • 2016-11-10 09:25:39
  • 458

DP 洛谷P1140 相似基因

题目背景大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。在一个人类基因工作组的任务中,生物学家研究的是...
  • sdz20172133
  • sdz20172133
  • 2018-02-13 02:26:45
  • 47

洛谷P1140 相似基因

题目背景大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。在一个人类基因工作组的任务中,生物学家研究的是...
  • yangrui2002
  • yangrui2002
  • 2018-02-18 20:13:27
  • 45

动态规划 洛谷P1140 相似基因

P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。 在一个人类基因工作组...
  • sdfzwzac
  • sdfzwzac
  • 2017-07-10 01:06:22
  • 64

落谷 P1140 相似基因

题目背景大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。在一个人类基因工作组的任务中,生物学家研究的是...
  • Jackleg
  • Jackleg
  • 2017-02-25 21:23:19
  • 328

P1140 - 相似基因 - 动态规划

题解链接: https://lucien.ink/archives/143/ 题目链接: https://www.luogu.org/problemnew/show/P1140 题目:...
  • xs18952904
  • xs18952904
  • 2018-04-09 23:32:27
  • 8

洛谷 1140 相似基因

规定两个基因的相似度为所有对应方法中,相似度最大的那个。 DP 状态转移方程:f[i][j]=max(f[i-1][j]+[j][-],f[i][j-1]+[i][-],f[i-1]...
  • sugar_free_mint
  • sugar_free_mint
  • 2018-02-23 13:25:51
  • 37

洛谷1140 相似基因

洛谷1140 相似基因 本题地址: http://www.luogu.org/problem/show?pid=1140 题目背景 大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简...
  • hahalidaxin
  • hahalidaxin
  • 2016-03-30 17:26:07
  • 583

一、动态规划(1)相似基因

相似基因 源程序名 GENE.??? (PAS, C, CPP) 可执行文件名 GENE.EXE 输入文件名 GENE.IN 输出文件名 GENE.OUT 大家都知道,基因可以看作一个碱基对...
  • BOYxiejunBOY
  • BOYxiejunBOY
  • 2015-07-14 12:13:07
  • 618

POJ 1080 基因序列相似度计算 动态规划

本题为典型的动态规划,关键找出序列比对的3个不同情况,即子问题 设d[i][j]为取s1第i个字符,s2第j个字符时的最大分值 则决定p为最优的情况有三种 p数组为分数矩阵 1、  s1取第i个...
  • yangliuy
  • yangliuy
  • 2011-12-23 00:11:04
  • 2533
    个人资料
    持之以恒
    等级:
    访问量: 755
    积分: 520
    排名: 10万+
    文章存档