蒜头君面前有一排 nn 个木桩,木桩的高度分别是h_1,h_2,h_3\cdots h_nh1,h2,h3⋯hn。蒜头第一步可以跳到任意一个木桩,接下来的每一步蒜头不能往回跳只能往前跳,并且跳下一个木桩的高度 不大于 当前木桩。蒜头君希望能踩到尽量多的木桩,请你帮蒜头计算,最多能踩到多少个木桩。
输入格式
第一行输入一个整数 nn 代表木桩个数。第二行输入 nn 个整数 h_1,h_2,h_3\cdots h_nh1,h2,h3⋯hn,分别代表 nn 个木桩的高度。(1 \leq n \leq 1000,1 \leq h_i \leq 1000001≤n≤1000,1≤hi≤100000)
输出格式
输出一个整数,代表最多能踩到的木桩个数,占一行。
样例输入
6 3 6 4 1 4 2
样例输出
4
该题仔细想想就是LIS的简单变种,学过LIS(最长上升子序列)的同学都知道该如何解;
简单解法就是倒置数组 求该数组的最长上升子序列即可
AC代码
#include <bits/stdc++.h>
#include <memory.h>
using namespace std;
int main()
{
int dp[10010],n,a[1010],tmp[1010],MAX=-1010;
memset(dp,0,sizeof(dp));
cin>>n;
for(int i=1;i<=n;i++)//初始化桩子
cin>>a[i];
for(int i=1;i<=n;i++)//倒置桩子 求最长上升子序列
tmp[n-i+1]=a[i];
for(int i=1;i<=n;i++)
{
dp[i]=1;
for(int j=1;j<i;j++)
if(tmp[j]<=tmp[i])
dp[i]=max(dp[i],dp[j]+1);
MAX=max(MAX,dp[i]);
}
cout<<MAX;
return 0;
}