0
0
已采纳
汪恺恒
中级启示者
中级启示者
注意看题,它说山脉必须连续。
所以,f[i]和g[i]两个数组只能由f[i-1]和g[i-1]推导出来
f数组推导:
for(int i=1;i<=n;i++){
if(a[i]>a[i-1]) f[i]=f[i-1]+1;
else f[i]=1;
}
g数组和统计答案自己写
1
梁怡墨
新手守护
新手守护
int n,a[1000005],l[1000005],r[1000005];
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
l[i]=1;
r[i]=1;
}
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(a[j]<a[i]){
l[i]=max(l[i],l[j]+1);
}
}
}
for(int i=n-2;i>=0;i--){
for(int j=n-1;j>i;j--){
if(a[j]<a[i]){
r[i]=max(r[i],r[j]+1);
}
}
}
int s=l[0]+r[0];
for(int i=1;i<n;i++){
if(l[i]+r[i]>s){
s=l[i]+r[i];
}
}
cout<<s-1;
呜呜呜,超时
1
0
0
杜承俊
资深守护
资深守护
超时代码
- #include<bits/stdc++.h>
- using name** std;
- int a[1010],b[1010],c[1010],n,mx=0;
- int main(){
- cin>>n;
- for(int i=1;i<=n;i++)scanf("%d",&a[i]);
- for(int i=1;i<=n;i++){
- b[i]=1;
- for(int j=1;j<i;j++)
- if(a[i]>a[j]) b[i]=max(b[i],b[j]+1);
- } for(int i=n;i>=1;i--){
- c[i]=1;
- for(int j=n;j>=i+1;j--)
- if(a[i]>a[j])
- c[i]=max(c[i],c[j]+1);
- }
- for(int i=1;i<=n;i++)
- mx=max(b[i]+c[i]-1,mx);
- cout<<n-mx;
- }
- AC代码时用到二分的,你应该没学