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]);
    }
}
原文地址:https://www.cnblogs.com/a1439775520/p/12947367.html