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();
}
}
查看更多关于最长单调递增子序列LIS(《算法导论》15.4-5题)的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did238252