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(); } }