• 最长降序子序列一道航天标准化笔试题


    有一无序整数列 X1,X2,... ,Xn。用从该序列中删除若干数字的方法,使剩下的长度为m的序列成为单调递减的序列。注意,不可以改变序列中数字的顺序关系。要求构造算法求得m值为最大的序列,即删除数字最少,结果序列最长的序列。  例如:  

    1) 序列       4,8,6 ,5 ,2 ,1,3,2,1   (n=9)     

        删除3个数  (4),8,6,5,(2),(1),3,2,1     

        结果      8,6,5,3,2,1     (m=6)

    2) 序列       4,1,3,2,1,8,0,7,6 ,5 ,1   (n=11)          

        结果     8,7,6,5,1     (m=5)                   

                  4,3,2,1,0     (m=5)

        备注:序列2为多解的情况.

    代码
    package src;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;


    public class Psort {
    private String input;
    private int[] inputInt;
    List list_src
    =new ArrayList();
    List list_des
    =new ArrayList();
    List list_src2
    =new ArrayList();
    List list_des2
    =new ArrayList();

    public Psort() {
    // TODO 自动生成构造函数存根
    System.out.println("请用中文输入法输入数字序列,用\",\"隔开");
    input
    =this.inputFromKeyBoard();
    String[] inputChar
    =input.split("");
    inputInt
    =new int[inputChar.length];
    for(int i=0;i<inputChar.length;i++){
    inputInt[i]
    =Integer.parseInt(inputChar[i]);
    }
    initLinks();
    AG();
    while(!isOver()){
    list_des2
    =list_des;
    AG();
    }
    for(int i=0;i<list_des2.size();i++) {
    link link
    = (link) list_des2.get(i);
    System.out.println(
    "数目:"+link.count);
    System.out.println(
    "路径:"+link.road);
    }
    }

    public boolean isOver(){
    if(list_src.size()>=1){
    return false;
    }
    return true;
    }

    public void AG(){
    list_des
    =new ArrayList();
    for(int i=0;i<list_src.size();i++){
    for(int j=0;j<list_src2.size();j++){
    link link_i
    =(link)list_src.get(i);
    link link_j
    =(link)list_src2.get(j);
    if(link_i.n_value==link_j.p_value&&link_i.n_i!=link_j.n_i&&link_i.n_i<=link_j.p_i){
    link link_new
    =new link(link_i.p_value,link_i.p_i,link_j.n_value,link_j.n_i,link_i.count+link_j.count-1,link_i.road);
    list_des.add(link_new);
    }
    }
    }
    list_src
    =list_des;
    }

    public void initLinks(){
    for(int i=0;i<inputInt.length;i++){
    for(int j=i+1;j<inputInt.length;j++){
    if(inputInt[i]>=inputInt[j]){
    list_src.add(
    new link(inputInt[i],i,inputInt[j],j,2,String.valueOf(inputInt[i])));
    }
    }
    }
    list_src2
    =list_src;
    }

    /**
    *
    @param args
    */
    public static void main(String[] args) {
    // TODO 自动生成方法存根
    new Psort();
    }

    // 键盘输入,返回字符串
    public String inputFromKeyBoard(){
    String str
    =null;
    try{
    InputStreamReader inputReader;
    BufferedReader bufReader;
    inputReader
    = new InputStreamReader(System.in);
    bufReader
    = new BufferedReader(inputReader);
    str
    = bufReader.readLine();
    }
    catch(IOException e){
    e.printStackTrace();
    }
    return str;
    }
    // *****************************************************************************

    }
    class link{
    public int p_value;
    public int p_i;
    public int n_value;
    public int n_i;
    public int count;
    public String road;

    public link(int p_value,int p_i,int n_value,int n_i,int count,String road){
    this.p_value=p_value;
    this.p_i=p_i;
    this.n_value=n_value;
    this.n_i=n_i;
    this.count=count;
    this.road=road+" "+n_value;
    }
    }

  • 相关阅读:
    Postmanapi接口自动化局限性
    爱加密加固产品原理分析_定制版
    白话文理解DCT离散余弦变换
    mysql like使用预编译
    【Jenkins】jenkins控制台/生成的日志文件 中文乱码
    【Python】连接Linux并执行命令
    【Java】时间转换(可用于计算耗时场景)
    【Java】List去重 / 删除ArrayList中重复元素,保持顺序 / 提取两个list中不同的元素
    【Java】读取文本文件
    【Python】文件转码/编码/解码/utf8
  • 原文地址:https://www.cnblogs.com/frostbelt/p/1856745.html
Copyright © 2020-2023  润新知