五一到了,PKU-ACM队组织大家去登山观光,队员们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?
InputLine 1: N (2 <= N <= 1000) 景点数
Line 2: N个整数,每个景点的海拔Output最多能浏览的景点数Sample Input8186 186 150 200 160 130 197 220
Sample Output
4 代码:
#include#include #include #include #include #include #include #include
import java.util.Scanner;public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 int[] a= new int[1005]; int[] b= new int[1005]; int[] dp1=new int[1005]; int[] dp2=new int[1005]; Scanner sc=new Scanner(System.in); int N=sc.nextInt(); for(int t=1;t<=N;t++) { a[t]=sc.nextInt(); } for(int t=1;t<=N;t++) { b[N-t+1]=a[t]; } for(int t=1;t<=N;t++) { dp1[t]=1; dp2[t]=1; } for(int t=1;t<=N;t++) { for(int j=1;ja[j]) { dp1[t]=max(dp1[t],dp1[j]+1); } } } for(int t=1;t<=N;t++) { for(int j=1;j b[j]) { dp2[t]=max(dp2[t],dp2[j]+1); } } } int ans=0; for(int t=1;t<=N;t++) { ans=max(dp1[t]+dp2[N-t+1]-1,ans); } System.out.println(ans); sc.close(); } private static int max(int i, int j) { // TODO 自动生成的方法存根 if(i>j) return i; else return j; }}