动态规划_最长不下降子序列 java
题目:
给定n个整数组成的序列,求所有不下降子序列中最长的长度。例如{A_n}=3,18,7,14,10,12,23,41,16,24,其中3,18,23,41是一个长度为4不下降子序列,
但3,7,10,12,16,24是一个长度为6的子序列。
发现若A(i)>=A(i-1),以A(i)结尾的最长不下降序列的长度应该为以A(i-1)结尾的最长不下降序列加1。若小于,则从A(i-1)往前找,直到满足A(i)>A(j),此时
最长不下降序列长度为以A(j)结尾的长度加1。创建一个数组记录以各个元素为结尾的最长子序列长度,最后输出最大值。时间复杂度为O(n^2)
public class LongestNondescendantSequence { public static void main(String[] args) { int[] arr=new int[] {3,18,7,14,10,12,23,41,16,24}; LNS(arr); } public static void LNS(int[] arr) { int[] a=new int[arr.length]; int max=0; //单个元素不下降子序列长度不可能小于1,初始化为1 for(int i=0;i<arr.length;i++) a[i]=1; for(int i=1;i<arr.length;i++) { //若当前元素大于上一个元素,则当前元素结尾的不下降子序列长度加1 if(arr[i]>=arr[i-1]) a[i]=a[i]+a[i-1]; //否则的话从前一个元素从后向前寻找小于当前元素的元素,找到后以当前元素为结尾的不下降子序列长度是以找到的元素为结尾的不下降子序列长度加1 else { for(int j=i-1;j>=0;j--) { if(arr[j]<arr[i]) { a[i]=a[j]+1; break; } } } } //打印最大长度 for(int i=0;i<a.length;i++) { if(a[i]>max) max=a[i]; } System.out.print(max); } }
打印结果