给定一个长度为 N的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数 N。
第二行包含 N 个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
package simple; import java.util.Scanner; public class day5 { public static void main(String[] args) { final int N = 1010; int [] a = new int[N]; int [] f = new int[N]; Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for(int i = 1; i <= n; i ++){ a[i] = sc.nextInt(); } for(int i = 1; i <= n; i ++){ f[i] = 1; for(int j = 1; j < i; j ++){ if(a[i] >a[j]) { f[i] = Math.max(f[i],f[j] + 1); } } } int r = 0; for(int i = 1; i <= n; i ++){ r = Math.max(r,f[i]); } System.out.println(r); } }
本方法采用了DP。
a[i]表示数组,f[i]表示第i个数前面的单增的子序列的最大长度
思路:将1~i分成1~i- 1,和i两部分,取(1,i - 1) j ∈(1,i -1)的最大值,f[i] = Math.max(f[i],f[j] + 1)。