最長單調遞增子序列LIS(《算法導論》15.4-5題)


LIS問題可以轉化為LCS問題求解,或者轉化為動態規划方式求解。

LCS問題的遞推式為:

                           

動態規划法遞推式為:

                          

 

LCS程序上一篇文章里有寫過,這里是第二種方法的程序(參考了《算法導論》及其他人的程序):

import java.util.Scanner;

public class LIS {
    public static void main(String[] args) {
        //從控制台獲取輸入,並轉換為整型數組(以空格作為分隔符,輸入整數)
        Scanner sc=new Scanner(System.in);
        String[] s=sc.nextLine().split(" ");
        int[] arr=new int[s.length];
        for(int i=0;i<s.length;i++){
            arr[i]=Integer.parseInt(s[i]);
        }
        /*for(int x:arr){//for each用法
            System.out.print(x+" ");
        }*/ 
        
        //動態規划法(f(i)表示arr中以ai為末元素的最長遞增子序列的長度)
        int n=arr.length;
        int[] f=new int[n];          //用於存放f(i)值
        f[0]=1;                      //以第a1為末元素的最長遞增子序列長度為1
        for(int i=1;i<n;i++){        //循環n-1次
            f[i]=1;                  //f[i]的最小值為1
            for(int j=0;j<i;j++){    //循環i次
                if(arr[j]<arr[i]&&f[j]+1>f[i]){
                    f[i]=f[j]+1;     //更新f[i]的值
                }
            }
        }
        System.out.println(f[n-1]);
        sc.close();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM