最长的单调自增子序列
问题描述
给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4.
想法
利用动态规划:
dp[i]为 以A[i]结尾的子序列的最长递增长度
因此A{5, 6, 7, 1, 2, 8} 来说
dp[0] = 1, {5}
dp[1] = 2 ,{5,6}
dp[2] = 3, {5,6,7}
dp[3] = 1 ,{1}...
因此动态转移方程为 dp[i] = max{dp[0]+1,dp[1]+1,...dp[i](值为1),其中要满足,值要比当前dp[i]小
数组A {5, 6, 7, 1, 2, 8}
dp数组为:【1,2,3,1,2,4】
解释一下,4为结尾为8的最长子序列。
public int getLIS(int[] arr, int n) { if(arr==null||arr.length<=0) return 0; //创建dp数组 int[] dp=new int[arr.length]; dp[0]=1; //用于记录最长的长度 int maxLen = 1; for(int i=1;i<arr.length;i++){ //每次都需要置1 dp[i] =1; for(int j=i-1;j>=0;j--){ //找到比当前arr[i] 要小的 if (arr[j] < arr[i]) dp[i] = Math.max(dp[i],dp[j]+1); } maxLen = Math.max(dp[i],maxLen); } return maxLen; }