zoukankan      html  css  js  c++  java
  • java实现第三届蓝桥杯DNA对比

    DNA对比

    脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子。它由4种主要的脱氧核苷酸(dAMP、dGMP、dCMT和dTMP)通过磷酸二酯键连接而成。这4种核苷酸可以分别记为:A、G、C、T。
    DNA携带的遗传信息可以用形如:AGGTCGACTCCA… 的串来表示。DNA在转录复制的过程中可能会发生随机的偏差,这才最终造就了生物的多样性。

    为了简化问题,我们假设,DNA在复制的时候可能出现的偏差是(理论上,对每个碱基被复制时,都可能出现偏差):

    1. 漏掉某个脱氧核苷酸。例如把 AGGT 复制成为:AGT

    1. 错码,例如把 AGGT 复制成了:AGCT

    2. 重码,例如把 AGGT 复制成了:AAGGT

    如果某DNA串a,最少要经过 n 次出错,才能变为DNA串b,则称这两个DNA串的距离为 n。

    例如:AGGTCATATTCC 与 CGGTCATATTC 的距离为 2

    你的任务是:编写程序,找到两个DNA串的距离。

    【输入、输出格式要求】

    用户先输入整数n(n<100),表示接下来有2n行数据。

    接下来输入的2n行每2行表示一组要比对的DNA。(每行数据长度<10000)

    程序则输出n行,表示这n组DNA的距离。

    例如:用户输入:
    3
    AGCTAAGGCCTT
    AGCTAAGGCCT
    AGCTAAGGCCTT
    AGGCTAAGGCCTT
    AGCTAAGGCCTT
    AGCTTAAGGCTT

    则程序应输出:
    1
    1
    2

    【注意】

    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

    在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。

    请把所有函数写在同一个文件中,调试好后,拷贝到【考生文件夹】下对应题号的“解答.txt”中即可。

    相关的工程文件不要拷入。
    源代码中不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。

    允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。
    例如,不能使用CString类型(属于MFC类库),不能使用randomize, random函数(不属于ANSI C++标准)

    import java.util.Scanner;
    
    public class Main {
        public static int n;
        public static String[] arrayA;
        
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            n = in.nextInt();
            arrayA = new String[2 * n + 1];
            in.nextLine();
            for(int i = 1;i <= n;i++) {
                arrayA[2 * i - 1] = in.nextLine();
                arrayA[2 * i] = in.nextLine();
            }
            int[] result = new int[n + 1];
            for(int i = 1;i <= n;i++) {
                String A = arrayA[2 * i - 1];
                String B = arrayA[2 * i];
                int lenA = A.length();
                int lenB = B.length();
                int[][] dp = new int[lenA + 1][lenB + 1];
                for(int k = 0;k < lenA;k++)
                    dp[k][0] = k;
                for(int k = 0;k < lenB;k++)
                    dp[0][k] = k;
                for(int a = 1;a <= lenA;a++) {
                    for(int b = 1;b <= lenB;b++) {
                        if(A.charAt(a - 1) == B.charAt(b - 1))
                            dp[a][b] = dp[a - 1][b - 1];
                        else {
                            dp[a][b] = Math.min(dp[a - 1][b]+1, Math.min(dp[a][b-1]+1, dp[a-1][b-1]+1));
                        }
                    }
                }
                result[i] = dp[lenA][lenB];
            }
            for(int i = 1;i <= n;i++)
                System.out.println(result[i]);
        }
    }
    
  • 相关阅读:
    php 下载文件
    thinkphp3.1 发送email
    微擎 plugin 时间插件 图片上传插件不显示 报错 影响下面执行
    Java中基本数据类型的对比记忆
    堆内存设置以及垃圾回收方式
    try--catch--finally中return返回值执行的顺序(区别)
    Java中的值传递和引用传递
    全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)
    10进制转换成16进制最简单的方法
    quartz 框架定时任务,使用spring @Scheduled注解执行定时任务
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947367.html
Copyright © 2011-2022 走看看