zoukankan      html  css  js  c++  java
  • JAVA最长递增子序列

    问题描述  LIS(Longest Increasing Subsequence,最长递增子序列):给出一个序 列a1,a2,a3,a4,a5,a6,a7…an,求它的一个子序列(设为s1,s2,…sn),使得这个 子序列满足这样的性质,s1<s2<s3<…<sn并且这个子序列的长度最长。 • 【任务】输出这个最长子序列的长度。 • 【样例输入】 1 7 3 5 9 4 8 • 【样例输出】 长度为4【序列为1 3 5 9或1 3 4 8 】
    最长递增子序列
    实例分析 1 7 3 5 9 4 8 1

    最长递增子序列
     算法设计  设b[i]是在a[i]为单调递增子序列最后一个元素时,所得最长单调递增子序列 的长度
      
     

    i)j1a[i]if(a[j] 1max(b[j]) 1)if(i 1
    b[i]

    最长递增子序列
     算法设计  a数组存储原始数据  b数组存储对应最长上升子序列长度
    i 1 2 3 4 5 6 7 a[i] 1 7 3 5 9 4 8 b[i]初始值 1 1 1 1 1 1 1 b[i] 1 2 2 3 4 3 4
    最长序列长度
    1 7 3 5 9 4 8
    i 1 2 3 4 5 6 7``
    a[i] 1 7 3 5 9 4 8
    b[i] 1 2 2 3 4 3 4
    pre[i] 0 1 1 3 4 3 6

    package book;
    
    import java.util.Scanner;
    
    public class 最长公共子序列 {
    static int n;
    static int a[];//原始数据
    static int b[];//存放最长的序列长度
    static int c[];//
    static int pre[];//存放前一个数据编号
    static int max;
    static int lab;//存储最长子序列的最后一个元素的位置
    	public static void main(String[] args) {
    		Scanner sc=new Scanner(System.in);
    		n=sc.nextInt();
    		a=new int[n+1];
    		b=new int[n+1];
    		c=new int[n+1];
    		pre=new int[n+1];
    		for(int i=1;i<=n;i++) {
    			a[i]=sc.nextInt();
    		}
            slove();
            System.out.printf("%d
    ",max);
          //输出数列O(n) 
            for(int i=1;i<=max;i++) {  System.out.printf("%d,",c[i]); } 
    
    	}
    	private static void slove() {
    	  b[1]=1;//第一个数字本身长度为1;
    	  for(int i=2;i<=n;i++) {
    		  max=0;
    		  for(int j=i-1;j>=1;j--) {
    			  if(a[j]<a[i]&&b[j]>max) {
    				  max=b[j];//要这个数的关键是
    				  pre[i]=j;
    			  }
    		  }
    		  b[i]=max+1;
    	  }
    	  max=b[1];
    	  for(int i=2;i<=n;i++) {
    		  if(b[i]>max) {
    			  max=b[i];
    			  lab=i;
    		  }
    	  }
    	  int i=lab;
    	  int num=max;
    	  int j=max;
    	  //将a数组复制到c数组
    	  while(num>0) {
    		  c[j]=a[i];
    		  j--;
    		  i=pre[i];
    		  num--;
    		  
    	  }
    	 
    		
    	}
    
    }
  • 相关阅读:
    算法学习(二)——树状数组求逆序数
    ZOJ 2412 Farm Irrigation
    排列的生成算法(一)
    汉诺塔递归实现
    汇编(五)
    汇编(四)
    汇编(三)
    汇编(二)
    0103MySQL中的B-tree索引 USINGWHERE和USING INDEX同时出现
    0103如何通过索引长度确定是否使用全索引
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309574.html
Copyright © 2011-2022 走看看