`
linest
  • 浏览: 155677 次
  • 性别: Icon_minigender_1
  • 来自: 内蒙古
社区版块
存档分类
最新评论

ZOJ-1027* 基因串匹配

    博客分类:
  • acm
 
阅读更多
1027:给出两串基因判断相似度。不同的匹配关系由下表分值决定



两串基因串长度不一定相等。用-补齐,其中-和-不能匹配。求最大匹配分值。


A G T G A T G
- G T T A - G

最大分值:(-3)+5+5+(-2)+5+(-1) +5=14

思路:最优问题,动态规划。关键是找出递推关系,避免重复计算。

出入串A,B  长度分别为i,j   倒着考虑
引入二维数组 opt[i][j] 每一项代表长度i的A串和长度j的B串的最大匹配分值。
最后一位可能的匹配方式有三种,总想法是新最优=最后的匹配分+之前的最优 
A为- B为字母       opt[i][j]=lastscore + opt[i][j-1]
A为字母  B为-     opt[i][j]=lastscore + opt[i-1][j]
A为字母  B为字母   opt[i][j]=lastscore + opt[i-1][j-1]
取三者的最大值即可计算。

i=0时说明A串全为- 可以算出不同B串的得分。
j=0时说明B串全为- 可以算出不同A串的得分。
opt[0][0]=0。 这些作为初始值。

从opt[0][0]开始,逐步计算扩展,得到opt[i][j]。



#include<stdio.h>
#include<map>
#include<iostream>
using namespace std;

#define MaxN 101

char str1[MaxN],str2[MaxN];
map<char,int> m;
int opt[MaxN][MaxN];

int main()
{	
	m['A']=0;
	m['C']=1;
	m['G']=2;
	m['T']=3;
	m['-']=4;

	int score[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 len1;
	int len2;
	int N;

	cin>>N;
	for(int k=0;k<N;k++)
	{
		cin>>len1;
		cin>>str1;
		cin>>len2;
		cin>>str2;

		opt[0][0]=0;
		for(int i=1;i<=len1;i++)
			opt[i][0] = opt[i-1][0] + score[m[str1[i-1]]][4];
	

		for(int i=1;i<len2;i++)
			opt[0][i] = opt[0][i-1] + score[4][m[str2[i-1]]];

		int m1,m2,m3;
		for(int i=1;i<=len1;i++)
			for(int j=1;j<=len2;j++)
			{
				m1=opt[i-1][j]+score[m[str1[i-1]]][4];
				m2=opt[i][j-1]+score[4][m[str2[j-1]]];
				m3=opt[i-1][j-1]+score[m[str1[i-1]]][m[str2[j-1]]];
				
				int max=m1;
				if(m2>max)
					max=m2;
				if(m3>max)
					max=m3;
				opt[i][j]=max;
			}

		cout<<opt[len1][len2]<<endl;
	}
}




  • 大小: 2.9 KB
分享到:
评论

相关推荐

    ACM算法经典书籍----最全最详细的书籍推荐!

    - 字符串处理 - 几何算法 - 网络流算法等 #### 三、Algorithm Design - **书名**: *Algorithm Design* - **作者**: Jon Kleinberg 和 Éva Tardos - **特点**: 这是一本非常实用且深入浅出的算法设计书籍。 - **...

    在线判断-算法题

    ZOJ (Zhejiang University Online Judge) - **特点**:浙江大学主办的在线编程平台。 - **适用对象**:ACM竞赛选手。 - **优势**:与高校合作紧密,实战经验丰富。 ### 17. CodeChef - **特点**:印度的一家在线...

    acm新手训练方案新手必备

    - **匹配算法**:如匈牙利算法(Hungarian Algorithm)。 - **示例题目**: - POJ 1459: 匈牙利算法实践 - POJ 3436: 匈牙利算法变种 ##### 3. 数据结构 - **栈**:适用于后进先出(LIFO)的数据结构。 - **示例...

    Acm竞赛常用算法与数据结构

    - **浙江大学微软技术俱乐部**和**ZOJ**(在线评测系统)是训练和选拔优秀选手的重要平台。 - **参考书籍**:《C++ Primer》、《C++标准程序库》、《算法导论》、《算法艺术与信息学竞赛》等是深入学习的基础资料...

    acm 资料大全 程序 设计 竞赛 icpc

    - 字符串匹配算法(如KMP算法)。 - 字符串哈希与字符串相似度计算。 #### 五、学习计划与建议 - **初级阶段**:掌握基本的算法和数据结构,熟练解决简单问题。 - **中级阶段**:深入学习进阶算法,提高解题速度...

    欧拉回路题集

    1. **Strange Country II (ZOJ-3332) 竞赛图** - **题目描述**:在一种特殊的图——竞赛图中寻找哈密顿回路。 - **解题思路**:竞赛图中每个节点的入度和出度都为1,因此可以按照顺序构造哈密顿回路。 - **数据...

    ACM练习题库

    - 匈牙利算法(二分图匹配) - 网络流算法 - 线段树 - 并查集 - 动态规划(LCS、最长递增子序列等) - 博弈算法 - 判断点是否在多边形内部 3. **综合能力提升**: - 学习OIBH等平台上的高级算法论文 - 解决...

    线段树题目

    - **ZOJ 1610** 和 **POJ 2777**:这两道题都是典型的线段覆盖问题,需要利用线段树来解决。基本思路是通过线段树维护每个区间是否被覆盖的状态。对于每个覆盖请求,更新线段树对应区间中的覆盖状态,并统计完全被...

    ZOJ全部题目分类(分得很细哦)

    - **1051**: 字符串匹配问题,如KMP算法的应用。 - **1125**: 更复杂的字符串处理题目,可能涉及到正则表达式或自动机理论。 **学习目标:** - 熟练掌握常见的字符串操作函数。 - 学习高效的字符串搜索算法,如KMP...

    OnlineJudge站点网址

    #### 2.2 Zhejiang University ACM Online Judge (ZOJ) - **网址**: http://acm.zju.edu.cn - **特点**: - 由浙江大学维护,题目难度适中,适合练习ACM竞赛题目。 - 界面简洁,易于上手。 #### 2.3 Sichuan ...

    备战ACM资料 DP问题等

    - 场景:字符串匹配、游戏策略等。 #### 关键算法详解 - **动态规划** - **定义**:动态规划是一种通过把原问题分解为互相重叠的子问题的方式来求解复杂问题的方法。 - **特点**: - 适用于具有最优子结构的...

    acm程序设计曾宗根

    - **浙江大学在线评测系统(ZOJ)**:这是一个常用的在线评测平台,提供了丰富的题目资源和即时反馈机制。 - **提交代码**:介绍如何在ZOJ平台上注册账户、提交代码以及查看评测结果的过程。 #### 3. C++ STL泛型...

    国际大学生程序设计竞赛指南—ACM程序设计

    - **平台**: 例如浙江大学在线评测系统 (ZOJ)。 - **功能**: 在线提交代码、获取即时反馈。 - **流程**: - 注册账号并登录。 - 查看题目描述和要求。 - 编写并提交代码。 - 获取评测结果,根据结果调整代码直至...

    KM匹配题集

    KMP(Knuth-Morris-Pratt)算法是一种字符串匹配算法,主要用于在主串中查找子串出现的位置。这个算法避免了在遇到不匹配字符时的回溯,提高了搜索效率。KMP算法的核心是构造一个部分匹配表(也叫失配表),它记录了...

    ACM 竞赛常用算法与数据结构

    - **字符串处理**:KMP、Manacher's Algorithm等。 5. **训练和选拔**: - **浙江大学集训队**:选拔标准基于校内程序设计竞赛成绩及在线平台ZOJ的解题数。 - **强队构建**:队伍需要包含不同角色,如领队/协调...

Global site tag (gtag.js) - Google Analytics