描述
输入
Line 1: N (2 <= N <= 1000) 景点数
Line 2: N个整数,每个景点的海拔
输出
最多能浏览的景点数
样例输入
样例输出
五一到了,PKU-ACM队组织大家去登山观光,队员们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?
Line 2: N个整数,每个景点的海拔
8 186 186 150 200 160 130 197 220
4题意:
景点只要向下走之后就不能往上走,看最多能看多少景点
分析:
记录到每个点的前面几个景点是否往下走了
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[1005],f[1005],p[1005],i,j,b[1005]={0},maxn=0;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++){
f[i]=p[i]=1;
for(j=1;j<i;j++)
{
if(a[i]>a[j]&&b[j]==0)
{
if(f[i]<f[j]+1){
f[i]=f[j]+1;
b[i]=0;
}
}
else
if(a[i]==a[j])
{
if(f[i]==f[j]&&b[j]==0)
b[i]=0;
if(f[i]<f[j])
{
f[i]=f[j];
b[i]=b[j];
}
}
else
if(a[i]<a[j])
{
if(f[i]<f[j]+1){
f[i]=f[j]+1;
b[i]=1;
}
}
if(a[i]>a[j])
p[i]=max(p[i],p[j]+1);
}
if(p[i]>=f[i])
{
f[i]=p[i];
b[i]=0;
}
maxn=max(maxn,f[i]);
}
cout<<maxn<<endl;
}
感受:
我这个方法不好,我感觉有缺陷。。。应该分成两部分i点左边上升,右边下降。。