思路:求出序列的最长下降子序列即可 ,开一个DP数组,DP[i]表示第i个点的最大下降长度,扫面第i个点前的每一个点。
第二个问题与第一个类似,也可用贪心完成,故不做概述。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <stdlib.h>
#include <set>
#include <map>
using namespace std;
vector<int>A,B;
int DP[10005],DPS[10005];
int main()
{
ios::sync_with_stdio(false);
int t;
while(cin>>t)
A.push_back(t);
for(int i=0;i<A.size();i++)
{
DPS[i]=1;
DP[i]=1;
}
int ans1=0,ans2=0;
for(int i=0;i<A.size();i++)
{
for(int j=0;j<i;j++)
{
if(A[j]>A[i])
{
DP[i]=max(DP[j]+1,DP[i]);
}
if(A[j]<A[i])
{
DPS[i]=max(DPS[i],DPS[j]+1);
}
}
}
for(int i=0;i<A.size();i++)
{
ans1=max(ans1,DP[i]);
ans2=max(ans2,DPS[i]);
}
cout<<ans1<<endl;
cout<<ans2<<endl;
return 0;
}