最长递增子序列
2014-11-21 11:11
134 查看
问题:
给定一个整数数组,返回数组的最长递增子序列
分析:
设原数组为a, 将a排序得到b, 则 a 和 b 的最长公共子序列就是数组的 a 的最长递增子序列
package javainterview.string;
import java.util.Arrays;
public class LIS {
public static String lis(int[] arr){
if(arr==null || arr.length == 0)
return null;
int[] sortArr = Arrays.copyOf(arr, arr.length);
Arrays.sort(sortArr);
return lcs(arr, sortArr);
}
//最长公共子序列
public static String lcs(int[] a, int[] b){
int[][] dp = new int[a.length+1][b.length+1];
for(int i=0; i< a.length; i++){
for(int j=0; j< b.length; j++){
if(a[i] == b[j])
dp[i+1][j+1] = dp[i][j]+1;
else
dp[i+1][j+1] = Math.max(dp[i+1][j], dp[i][j+1]);
}
}
StringBuilder sb = new StringBuilder();
int x = a.length;
int y = b.length;
while(x!=0 && y!=0){
if(dp[x][y] == dp[x-1][y])
x--;
else if(dp[x][y] == dp[x][y-1])
y--;
else{
sb.append(a[x-1]);
x--;
y--;
}
}
return sb.reverse().toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {0,5,6,7,2,3,4};
String res = lis(arr);
System.out.println(res);
}
}
给定一个整数数组,返回数组的最长递增子序列
分析:
设原数组为a, 将a排序得到b, 则 a 和 b 的最长公共子序列就是数组的 a 的最长递增子序列
package javainterview.string;
import java.util.Arrays;
public class LIS {
public static String lis(int[] arr){
if(arr==null || arr.length == 0)
return null;
int[] sortArr = Arrays.copyOf(arr, arr.length);
Arrays.sort(sortArr);
return lcs(arr, sortArr);
}
//最长公共子序列
public static String lcs(int[] a, int[] b){
int[][] dp = new int[a.length+1][b.length+1];
for(int i=0; i< a.length; i++){
for(int j=0; j< b.length; j++){
if(a[i] == b[j])
dp[i+1][j+1] = dp[i][j]+1;
else
dp[i+1][j+1] = Math.max(dp[i+1][j], dp[i][j+1]);
}
}
StringBuilder sb = new StringBuilder();
int x = a.length;
int y = b.length;
while(x!=0 && y!=0){
if(dp[x][y] == dp[x-1][y])
x--;
else if(dp[x][y] == dp[x][y-1])
y--;
else{
sb.append(a[x-1]);
x--;
y--;
}
}
return sb.reverse().toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {0,5,6,7,2,3,4};
String res = lis(arr);
System.out.println(res);
}
}
相关文章推荐
- hdu1257最少拦截系统(动态规划之最长递增子序列或者用类队列来算)
- 给定一个整数数组,求它的一个最长递增子序列。
- poj 2533 Longest Ordered Subsequence(最长递增子序列)
- [转]最长递增子序列问题的求解
- 【算法知识总结】最长递增子序列
- TOJ--1765:Longest Ordered Subsequence (DP求最长递增子序列)
- 最长递增子序列
- leetcode 354 Russian Doll Envelopes 二元组最长递增子序列
- 拦截导弹-最长递增子序列LIS
- FZU2236 求最长递增子序列的个数----树状数组记录位置
- 【动态规划】 最长递增子序列
- poj 1887 Testing the CATCHER(最长递增子序列)
- 最长递增子序列LIS再谈
- 求数组中最长递增子序列
- 算法-最长递增子序列
- Cogs 731. [网络流24题] 最长递增子序列(最大流)
- 编程之美_012求数组中最长递增子序列
- zoj 2432(最长递增上升子序列)
- [网络流和线性规划24题]之六 最长递增子序列
- hdu 1423 最长公共递增子序列