Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 716|回复: 0

[算法学习]最长单调递增子序列的长度(LIS)及构成(JAVA)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-12-5 00:10:33 | 显示全部楼层 |阅读模式
    所谓子序列,就是在原序列里删掉若干个元素后剩下的序列,以字符串"abcdefg"为例子,去掉bde得到子序列"acfg",。现在的问题是,给你一个数字序列,你要求出它最长的单调递增子序列的长度(LIS)并输出构成。     设给定序列为 array[],大小为 n, 最长单调子序列必定以序列array[]中的某一个元素结尾,这是废话。     设lis为以array结尾的最长单调子序列的长度,那么array[]的LIS的长度就是:
    max{lis} (0<=i<n)  显然此问题具有最优子结构性质:
      
      
       
       

         
       

         
       
      

      lis[0]=1;
    lis[i+1]=max{1,lis[k]+1} (array[i+1]>array[k], k <= i)  即如果array[i+1]大于array[k],那么第i+1个元素可以接在lis[k]长的子序列后面构成一个更长的子序列。
    于此同时array[i+1]本身至少可以构成一个长度为1的子序列。
    1. import java.util.Scanner;
    2. public class TestLIS{
    3.   private  int n;
    4.   private int array[];
    5.   private int lis[];
    6.    public TestLIS(int n,int[] array){
    7.       this.n=n;
    8.       this.array=array;
    9.       lis=new int[n];
    10.    }
    11.    public static void main(String[] args) {
    12.      
    13.         Scanner in=new Scanner(System.in);
    14.         
    15.            int n=in.nextInt();
    16.            int[] array=new int[n];
    17.            for(int i=0;i< n;i++){
    18.                 array[i]=in.nextInt();
    19.            }  
    20.          
    21.           TestLIS tl=new TestLIS(n,array);
    22.           int maxl=tl.lis();
    23.          
    24.           System.out.println("最长单调递增子序列长度:"+maxl);
    25.           System.out.println();
    26.           System.out.println("最长单调递增子序列构成");
    27.           int k=tl.max();
    28.           tl.print(k);
    29.           System.out.println();
    30.       
    31.       
    32.    }
    33.   /**
    34.    * @param args
    35.    */
    36.    //求数组最长递增子序列
    37.   public  int lis()
    38.   {
    39.         for(int i =0;i< n;i++)
    40.         {
    41.                 lis[i]=1;
    42.                 for(int j=0;j< i;j++)
    43.                 {
    44.                         if(array[j]< array[i]&&(lis[j]+1>lis[i]))
    45.                           lis[i]=lis[j]+1;
    46.                        
    47.                
    48.                 }
    49.                
    50.         }
    51.         int max=0;
    52.         for(int k=0;k< lis.length;k++)
    53.         {
    54.                // System.out.print(lis[k]+"  ");
    55.                 if(lis[k]>max)
    56.                 max=lis[k];
    57.         }
    58.        // System.out.println();
    59.         return max;
    60.    }
    61.       //求数组中最大值下标  
    62.     private int max()  
    63.     {  
    64.         int max = lis[0];  
    65.         int k = 0;  
    66.         for (int i = 0; i < lis.length; i++)  
    67.         {  
    68.             if (max < lis[i])  
    69.             {  
    70.                 max = lis[i];  
    71.                 k = i;  
    72.             }  
    73.         }  
    74.         return k;  
    75.     }  

    76.     //输出   
    77.     public void print(int k)  
    78.     {      
    79.         for (int i = k - 1; i >= 0; i--)  
    80.         {  
    81.             if (lis[k] == lis[i] + 1 && array[i] <= array[k])  
    82.             {  
    83.                 print(i);  
    84.                 break;  
    85.             }  
    86.         }  
    87.         System.out.print(array[k] + " ");  
    88.     }  
    89. }
    复制代码
    运行:
    5
    1 10 4 9 7
    最长单调递增子序列长度:3  最长单调递增子序列构成
    1 4 9
      

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/12/5/001033359.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 04:04 , Processed in 0.337690 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表