F - 海景房
开发商计划在海边建造许多海景房的楼房,工程师发现在设计图中由于某些靠海的楼太高,导致有些稍远的楼房即使站在楼顶也不能看到海。开发商和工程师就在分析,只能在原设计图中保留一部分楼,才能保证所有的楼都可以在楼顶看到海。若两楼的高度相同,也认为可以在楼顶看到海。
按离海岸的距离从远到近的给出各楼在设计图上的高度,请你计算开发商最多可以建多少幢海景房
Input
输入有两行,第一行是设计图中的楼房数量N,第二行有N个正整数hi,表示各楼在设计图上的高度。
- 1 < N ≤ 25
- 1≤hi≤232
Output
输出1行一个整数,代表开发商最多可以保留下的海景房的数量
测试样例
输入样例
9 400 307 255 400 399 270 258 65 290
输出样例
6
典型的动态规划
其实就是最长递减子数列
dp[i]代表从左数起第i个楼房的最大连续数(最优解)
从左到右 每个数的最优解就是从这个数起所有左侧比它高的楼中的的最大dp[j]值+1
因此对每个数都要从当前位置向左遍历一遍
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long arr[] = new long[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
int dp[] = new int[n];
dp[0] = 1;
int ans=-1;
for (int i = 1; i < arr.length; i++) {
dp[i]=1; //之前少加了这一步 结果一直错
for (int j = i-1; j >=0; j--) {
if(arr[j]>=arr[i])
dp[i] = Math.max(dp[j]+1, dp[i]);
}
ans = Math.max(dp[i], ans);
}
System.out.println(ans);
}
}