【动态规划】最长上升子序列
此题为动态规划算法题,题目来源计科老班
题目描述
给出一个由n个数组成的序列A[1…n],求最长单调上升子序列(LIS)的长度。LIS即求最大的一个子序列长度m,使得a1<a2<……<am且A[a1]<A[a2]<……<A[am]。
输入
两行:
第1行:整数n (1<=n<=1000)
第2行:n个整数 (int范围内),空格隔开。
输出
一行:一个整数,即最长上升子序列长度。
样例输入
10
63 11 21 36 28 20 57 37 82 4
样例输出
5
思路详解
此题数据庞大,应该采用动态规划,将原问题分解为若干个子问题,先求解子问题,然后从这些子问题得解得到原问题的解。
此处提供O(n*n)复杂度算法。这道题,将j从第二个数开始循环,算出每一个j作为子序列最后一个数的最优子解。将j前的最长上升子序列记为L(i),则如果A(j)>A(i),则j上的最长上升子序列为L(i)+1;算出所有的结果,最终取最大值,则max{L(i)+1|0<=i<=j}
代码
import java.util.Scanner;
public class LIS1556 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n,max;
int[] A,L;
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
A=new int[n];
L=new int[n];
L[0]=1;
max=0;
for(int i=0;i<n;i++) A[i]=sc.nextInt();
for(int j=1;j<n;j++) {
L[j]=1;
for(int k=0;k<j;k++) {
if( A[j]>A[k] && L[k]+1>L[j])
L[j] = L[k]+1;
}
}
for(int a:L)if(a>max)max=a;
System.out.println(max);
}
}
本文介绍了一种使用动态规划解决最长上升子序列问题的方法,并提供了一个O(n^2)复杂度的示例代码实现。
2万+

被折叠的 条评论
为什么被折叠?



