最长上升子序列(dp)
Description
一个数的序列bi,当b1< b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,...,aN),
我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1<=i1
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
Input
输入的第一行是序列的长度N(1<=N<=1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。
Output
最长上升子序列的长度。
Sample Input
6
1 6 2 5 4 7
Sample Output
4
思路:
序列元素存储在q数组中
dp[i] 表示以q[i]结尾的子序列长度的最大值
初始化:dp[i]=1
转移方程:dp[i]=max(dp[i],dp[j]+1) 如果q[j]>q[i]
public class 最长上升子序列 { static final int N=1000+10; static int q[]=new int[N]; static int dp[]=new int[N]; //dp[i] 表示以q[i]结尾的最长上升子序列 static int n; public static void main(String[] args) { Scanner sc=new Scanner(System.in); n=sc.nextInt(); for(int i=1;i<=n;i++) q[i]=sc.nextInt(); //初始化 for(int i=1;i<=n;i++) dp[i]=1; for(int i=2;i<=n;i++){ for(int j=1;j<i;j++){ if(q[j]<q[i]) dp[i]=Math.max(dp[i], dp[j]+1); //状态转移方程 } } //现在dp[i]存储的都是以q[i]结尾的上升子序列的最大长度 //求出dp数组的最大值 int max=Integer.MIN_VALUE; for(int i=1;i<=n;i++){ if(dp[i]>max) max=dp[i]; } System.out.println(max); } }