Acwing---1014. 登山 (Java)_最长上升子序列_LIS模板

1014. 登山

原题链接

①. 题目

Acwing---1014. 登山  (Java)_最长上升子序列_LIS模板

②. 思路

  • 还是一样,正反预处理一遍每一个点的最长上升子序列,最后再枚举一下每个点正反最长子序列和的最大值,记得-1,枚举的点是重复记录了一次
  • 预处理出以每个点结尾的正向的最长上升子序列的值f[i],以每个点结尾的反向的最长上升子序列的值g[i]
  • res = max(f[i] + g[i] - 1),i = 1,2,3…n

③. 学习点

最长上升子序列

④. 代码实现

import java.util.Scanner;

public class _1014_登山_最长上升子序列进阶版 {
	static int N=1010;
	static int[] a=new int[N];
	static int[] f=new int[N];
	static int[] g=new int[N];
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		for (int i =1; i <=n; i++) {
			a[i]=sc.nextInt();
		}
		
		//正向LIS
		for (int i =1; i <=n; i++) {
			f[i]=1;
			for (int j = 1; j <i; j++) {
				if(a[j]<a[i]) f[i]=Math.max(f[i], f[j]+1);
			}
		}
		
		//反向LIS
		for (int i =n; i>=1; i--) {
			g[i]=1;
			for (int j =n; j>i; j--) {
				if(a[j]<a[i]) g[i]=Math.max(g[i], g[j]+1);
			}				
		}

		//枚举每一个点,计算最大值
		int res=0;
		for (int i =1; i <=n; i++) {
			res=Math.max(res, f[i]+g[i]-1);
		}
		System.out.println(res);
	}
}

Acwing---1014. 登山  (Java)_最长上升子序列_LIS模板

上一篇:poj2533(最长递增子序列模板题)


下一篇:4399知名游戏-赛尔号图鉴的爬取