POJ 1007:DNA排序

AC CODE:

 1 import java.util.Scanner;
 2
 3 public class Main {
 4
 5     public static void main(String[] args) {
 6         Scanner input = new Scanner(System.in);
 7
 8         // 得到数据
 9         int n = input.nextInt();
10         int m = input.nextInt();
11         String temp = input.nextLine(); // 获得输入m后的换行符
12         String[] dna = new String[m];
13         for (int i = 0; i < m; i++) {
14             dna[i] = input.nextLine();
15         }
16
17         // 获得每个DNA串中逆序对的数量
18         int[] record = getInitInt(m);
19         for (int i = 0; i < m; i++) {
20             for (int j = 0; j < n; j++) {
21                 for (int k = j + 1; k < n; k++) {
22                     if (isBiggerChar(dna[i].charAt(j), dna[i].charAt(k))) {
23                         record[i]++;
24                     }
25                 }
26             }
27         }
28
29         // 得到这些DNA数列中最大的逆序对是多少
30         int max = -1;
31         for (int i = 0; i < m; i++) {
32             if (record[i] > max) {
33                 max = record[i];
34             }
35         }
36
37         // 得到这些DNA串中逆序对从小到大的一个顺序队列mark[]
38         int[] mark = new int[m];
39         for (int i = 0, k = 0; i <= max; i++) {
40             for (int j = 0; j < m; j++) {
41                 if (record[j] == i) {
42                     mark[k++] = j;
43                 }
44             }
45         }
46
47         // 打印
48         for (int i = 0; i < m; i++) {
49             System.out.println(dna[mark[i]]);
50         }
51
52     }
53
54     private static int[] getInitInt(int m) {
55         int[] record = new int[m];
56         for (int i = 0; i < m; i++) {
57             record[i] = 0;
58         }
59         return record;
60     }
61
62     private static boolean isBiggerChar(char a, char b) {
63         if ((a - b) > 0) {
64             return true;
65         }else {
66             return false;
67         }
68     }
69
70 }

POJ 1007:DNA排序,布布扣,bubuko.com

时间: 2024-11-06 07:48:25

POJ 1007:DNA排序的相关文章

poj 4086:DNA排序

poj 4086:DNA排序 题目 描述 现在有一些长度相等的DNA串(只由ACGT四个字母组成),请将它们按照逆序对的数量多少排序. 逆序对指的是字符串A中的两个字符A[i].A[j],具有i < j 且 A[i] > A[j] 的性质.如字符串"ATCG"中,T和C是一个逆序对,T和G是另一个逆序对,这个字符串的逆序对数为2. 输入 第1行:两个整数n和m,n(0<n<=50)表示字符串长度,m(0<m<=100)表示字符串数量 第2至m+1行:

poj 1007 DNA Sorting (求逆序数)

DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 83069   Accepted: 33428 Description One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instanc

POJ 1007 DNA Sorting (归并排序)

题意: 输入m个长度为n的DNA序列,把他们按照逆序数从小到大稳定排序输出. PS:"稳定排序"就是当序列中出现A1==A2时,排序前后A1与A2的相对位置不发生改变. 思路:裸归并排序了  不懂得可以参考下http://blog.csdn.net/morewindows/article/details/6678165/  但是他的代码写错了!后来我按照理解自己写了一个,测了一下是对的! AC代码: #include<cstdio> #include<cstring&

POJ 1007 DNA Sorting

按逆序数从小到大排序.需要稳定排序.然而依然可以快排 #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int N = 55; const int M = 104; char str[M][N]; struct point{ int num, id; }p[M]; int n, m; void GetInverse(int id){ int i; in

poj 4084:拓扑排序

poj 4084:拓扑排序 很好的题目,恶心的算法 描述 给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前. 输入 若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号. v<=100, a<=500 输出 若干个空格隔开的顶点构成的序列(用小写字母). 样例输入 6 8 1 2 1 3 1 4 3 2 3 5 4 5 6 4 6 5 样例输出 v1 v3 v2 v6 v4 v5 解题方案 显然这是有向图,然

poj 2778 DNA Sequence(AC自动机+矩阵快速幂)

题目链接:poj 2778 DNA Sequence 题目大意:给定一些含有疾病的DNA序列,现在给定DNA长度,问有多少种不同的DNA序列是健康的. 解题思路:对DNA片段建立AC自动机,因为最多10个串,每个串最长为10,所以最多可能有100个节点,在长度为n时 以每个节点终止的健康字符串个数形成一个状态集,通过AC自动机形成的边可以推导出n+1的状态集,走到单词节点是 非法的,所以同样的我们可以先走到单词节点,但是从单词节点不向后转移.这样可以构造一个矩阵,剩下的就是矩阵 快速幂.注意的一

POJ 3691 DNA repair 基于AC自动机的DP

dp[i][j] 表示长度为 i 的前缀到达第 j 个节点的最小更改数目. 很显然有dp[0][0] = 0; dp[ i ][ j ] = min(dp[ i ][ j ],dp[i-1][k] + (j == k ? 0 : 1)),当且仅当j,k满足下列条件时. j 不为某条模式串的末节点 且 j 到 root 的由失败指针组成的路径上无末节点. j 是k的儿子节点 或者 j 的父节点可由 k 沿着失败指针找到. #include <algorithm> #include <ios

[poj 3691]DNA repair

好久没刷 poj 了,今天练习 AC 自动机时去水了一发喵~ 在 poj 上 A 题的感觉并没有 BZOJ 上那么愉悦,准确的说是痛不欲生 真是应了那句老话,你再慢也有比你慢的,你再快也有比你快的…… 跪求那些 0ms 的代码啊,还有那么多人都只跑了 32ms 啊!! 果然还是我太弱了吗?一定是我还太弱了 TAT 一道裸裸的 AC 自动机上 dp 令 dp[i][j] 表示母串的前 i 个字母遍历 AC 自动机,使之到达 j 节点,至少要修改多少个字母 dp[i+1][k]=min(dp[i+1

POJ 1007 Difference Between Primes(线性筛法求N以内的素数表)

Difference Between Primes Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description All you know Goldbach conjecture.That is to say, Every even integer greater than 2 can be expressed as the sum of two primes. Today, sk