zoukankan      html  css  js  c++  java
  • 算法笔记_124:密码脱落(Java)

    一 问题描述

    X星球的考古学家发现了一批古代留下来的密码。
    这些密码是由A、B、C、D 四种植物的种子串成的序列。
    仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
    由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。

    你的任务是:
    给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。

    输入一行,表示现在看到的密码串(长度不大于1000)
    要求输出一个正整数,表示至少脱落了多少个种子。

    例如,输入:
    ABCBA
    则程序应该输出:
    0

    再例如,输入:
    ABDCDCBABC
    则程序应该输出:
    3

    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗 < 3000ms


    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。

    二 解决方案

    原理(参考自网上一篇文章):

    import java.util.Scanner;
    
    public class Main {
        public static String A;
        public static String backA;
        
        public int dfs(int lenA, int lenB) {
            if(lenA == -1 || lenB == -1)
                return 0;
            if(A.charAt(lenA) == backA.charAt(lenB))
                return dfs(lenA - 1, lenB - 1) + 1;
            else
                return Math.max(dfs(lenA - 1, lenB), dfs(lenA, lenB - 1));
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            A = in.nextLine();
            backA = "";
            for(int i = A.length() - 1;i >= 0;i--)
                backA += A.charAt(i);
            int result = A.length() - test.dfs(A.length() - 1, backA.length() - 1);
            System.out.println(result);
        }
    }
  • 相关阅读:
    P1005 矩阵取数
    [BZOJ2662][BeiJing wc2012]冻结
    [BZOJ1191]超级英雄Hero
    [bzoj1008] 越狱
    [bzoj1001]狼抓兔子 最小割
    网络流24题——负载平衡问题
    分形小山
    可并堆——左偏树、斜堆
    NOIP最优贸易
    洛谷P2073送花
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6657606.html
Copyright © 2011-2022 走看看