题目:
分析:对每个点求出该点结束上升,开始下降,找最大的即可。
即使用一遍严格单调最长上升,严格单调最长下降即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int m;
int A1[105];
int A2[105];
int D1[105];
int D2[105];
int B1[105];
int B2[105];
int main()
{
cin>>m;
for(int i=0;i<m;i++)
{
cin>>A1[i];
A2[m-1-i]=A1[i];
}
int ok=1;
for(int i=1;i<m;i++)
{
if(A1[i]>A1[i-1]) continue;
ok=0;
break;
}
if(ok) {
cout<<0;
return 0;
}
ok=1;
for(int i=1;i<m;i++)
{
if(A2[i]>A2[i-1]) continue;
ok=0;
break;
}
if(ok) {
cout<<0;
return 0;
}
D1[0]=A1[0];
D2[0]=A2[0];
int len1 = 0, len2 = 0;
for (int i=1; i<m; i++) {
if (D1[len1]< A1[i])
{
D1[++len1] = A1[i];
B1[i]= len1+1;
}
else {
int p1 = lower_bound(D1, D1 + len1, A1[i])-D1;
D1[p1] = A1[i];
B1[i]=p1+1;
}
if (D2[len2] <A2[i])
{
D2[++len2] = A2[i]; B2[i]=len2+1;
}
else {
int p2 = lower_bound(D2, D2 + len2,A2[i]) - D2;
D2[p2] = A2[i];
B2[i]=p2+1;
}
}
int maxx=-1;
for(int i=1;i<m-1;i++)
{
maxx=max(maxx,B2[i]+B1[m-i]);
}
cout<<m-maxx+1<<' '<<len1+1<<' '<<len2+1<<endl;
maxx=min(m-maxx+1,m-max(len1+1,len2+1));
cout<<maxx;
}
哪儿的细节有问题啊!