`
s1099
  • 浏览: 19853 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

1007 DNA Sorting

    博客分类:
  • poj
 
阅读更多

      题目的意思很明显,就是算出每个字符串的逆序数,然后按照它们的逆序数排序,最后输出。因此这里的主要操作可以分两步:

 

①计算逆序数

      注意到这里出现的字符只有4种(ACGT),因此可以将字符串扫描一遍可以计算逆序数。方法是,对字符串进行正向扫描,记录扫描时C、G、T出现次数,如果当前扫描的字符是A,则逆序数要依次加上C、G、T的个数;如果是C,则逆序数加上G、T的个数;如果是G,则逆序数加上T的个数。

 

②将字符串按照逆序数进行排序

      这里要求当逆序数相同时,按照出现顺序排序,即排序结果要稳定。所以如果要使用快速排序的化,不能直接按照逆序数来当做比较标准,但可以变通,比如当逆序数相同时,把字符串的出现的顺序作为比较标准。

      在Java中于对象数组排序是稳定的(具体算法:在JDK7以前使用的是归并排序MergeSort,JDK7中使用的是TimSort有时间研究一下,希望可以看得懂~~)。

 

import java.util.*;
import java.io.*;
//1007 DNA Sorting
public class Main 
{
	public static void main(String[] args) throws Exception {
		Scanner in = new Scanner(new BufferedInputStream(System.in));
		int countOfCase, lengthOfString;

		lengthOfString = in.nextInt();
		countOfCase = in.nextInt();

		DNA[] DNAs = new DNA[countOfCase];
		for(int i = 0; i < countOfCase; i++)
			DNAs[i] = new DNA(in.next());

		Arrays.sort(DNAs);

		for(DNA dna: DNAs)
			System.out.println(dna.strOfDNA);
	}
}

class DNA implements Comparable<DNA>
{
	String strOfDNA;
	int countOfInversion;

	public DNA(String strOfDNA) {
		this.strOfDNA = strOfDNA;
		calInversion();
	}

	private void calInversion() {
		countOfInversion = 0;

		int C = 0, G = 0, T = 0;
		for(int i = 0, n = strOfDNA.length(); i < n; i++) {
			switch(strOfDNA.charAt(i)) {
				case 'A':
					countOfInversion = countOfInversion + C + G + T;
					break;
				case 'C':
					C++;
					countOfInversion = countOfInversion + G + T;
					break;
				case 'G':
					G++;
					countOfInversion = countOfInversion + T;
					break;
				case 'T':
					T++;
					break;
			}
		}
	}

	public int compareTo(DNA another) {
		return countOfInversion - another.countOfInversion;
	}
}
 
分享到:
评论

相关推荐

    poj 1007 DNA Sorting

    DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 34868 Accepted: 13480 Description One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are ...

    pku acm 1007 DNA Sorting代码

    pku acm 1007 DNA Sorting代码 逆序数 排序 解题报告请访问:http://blog.csdn.net/china8848

    POJ1007-DNA Sorting

    【标题】"POJ1007-DNA Sorting"是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。这个题目要求参赛者编写程序,对DNA序列进行排序,具体而言,就是对一系列由ATCG四种碱基组成的DNA字符...

    1007_DNASorting

    【标题】"1007_DNASorting"指向的是一道来自北京大学ACM竞赛的编程题目,这通常意味着我们需要解决一个算法或逻辑上的问题。在编程竞赛中,这样的题目经常测试参赛者的数据结构、算法理解和高效编码能力。"DNA...

    poj dna sorting

    poj dna sorting 问题,研究的ac coderrrrrrr

    East Central North America 1998测试数据

    "East Central North America 1998测试数据" 提供的是一组与1998年东中北美地区编程竞赛相关的测试资源,特别提及了POJ(Problem Set of Peking University Online Judge)中的1007DNA Sorting问题。这个标题暗示了...

    强大POJ分类,新手进阶用

    数学类题目是POJ中常见的类型,例如1007DNA Sorting涉及到排序算法,1338Ugly Numbers需要理解并生成丑数序列,1664放苹果则可能涉及到组合数学和贪心策略。这些题目挑战着用户的逻辑思维和数学功底。 此外,还有...

    POJ ACM题目分类.

    - **排序与比较**:1007 DNA Sorting对DNA序列进行排序。 2. **数据结构**: - **树形结构**:1308 Is It A Tree?判断一个图是否为树。 - **链表操作**:虽然未明确提及,但链表作为基础数据结构,在很多题目...

    DNA翻译C语言代码

    在生物信息学领域,DNA(脱氧核糖核酸)是生命的基本遗传物质,它编码了所有生物体的遗传信息。DNA翻译是生物学中的一个关键过程,通过这个过程,DNA的信息被转化为蛋白质,这些蛋白质是细胞功能的核心部分。在这个...

    selection sorting选择排序,c++

    生成一个可以控制上下界限的随机数列,并使用选择排序selection sorting算法对其排序。

    POJ分类题(按照算法分类)

    8. 1007DNASorting:该问题可能需要使用算法对DNA序列进行排序。 9. 1032Parliament:该题目可能是模拟议会投票或分配问题。 10. 1045BodePlot:这可能是与信号处理相关的题目,需要根据Bode图进行分析。 11. ...

    69982581.rar_人工智能/神经网络/深度学习_C/C++_

    文件名列表中,“求DNA的无序的数值(DNA Sorting).cpp”可能是解决一个问题的源代码,即对DNA序列进行排序。DNA排序可能涉及到生物信息学,一个结合生物学、计算机科学和数学的交叉学科。在ACM竞赛中,这样的题目...

    pku题目分类.doc

    8. **数论**:"DNA Sorting"、"The Fun Number System"可能涉及到数论概念,如质数、同余、模运算等。 9. **组合数学**:"Cipher"可能需要用到组合计数、排列组合等知识,也可能与动态规划结合。 10. **贪心**:...

    ZJU_ACM_All_Anwer 搞编程的都知道的浙江大学A 题库.本书 集了所有经 Z 题解集,集合并附 Mathimaticsumerical algorithms 数值算法

    1007 Numerical Summation of a Series 简单题,还是蛮有意思的 1045 HangOver 简单题 1049 I Think I Need a Houseboat 简单题 1028 Flip and Shift 简单题,可以DP/BFS/……,但是实际上有数学方法可直接判断...

    浙江大学ACM题解/ZJU 题型分类

    1007 Numerical Summation of a Series 简单题,还是蛮有意思的 1045 HangOver 简单题 1049 I Think I Need a Houseboat 简单题 1028 Flip and Shift 简单题,可以DP/BFS/……,但是实际上有数学方法可直接判断...

    后缀数组((处理字符串的有力工具))

    后缀数组的构建方法主要有两种:线性时间复杂度的Manber-Myers算法和基于-SAIS(Suffix Array Construction by Induced Sorting)的算法。Manber-Myers算法通过构造前后缀匹配矩阵,利用自归约性质达到线性时间...

    后缀数字资料

    构建后缀数组有多种方法,早期的线性时间复杂度算法如SA-IS(Suffixed Array Construction by Integers Sorting)由Kärkkäinen和Sanders在2003年提出。该算法首先将字符串转换为整数表示,然后对整数序列进行排序...

    从“公共子串”的角度来分析求解“最长公共子序列”(LCS)

    此外,还有一种基于堆的数据结构解决方案,称为“Patience Sorting”算法,它可以在O(n log n)的时间复杂度内找到两个有序序列的LCS。 在实际应用中,LCS问题广泛应用于生物信息学(如DNA序列比对)、文本编辑器的...

Global site tag (gtag.js) - Google Analytics