思路:求出序列的最长下降子序列即可 ,开一个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; }