解题思路:
- 入坑思路,求得最长不严格下降子序列以后,思路一直在记录经历过的点上,思索良久发现不可行。最后查看dp数组中的值,想发现一些规律,迷惑地发现,只要在dp数组中求出严格上升子序列的个数就可以获得答案,结果过了5个测试点后挂了。接下来没有任何思路了。
- 通过看题解知道了一个牛逼的Dilworth定理。然后按部就班地套一发就过了。
#include<bits/stdc++.h>
using namespace std;
//求得最长下降子序列长度完成第一问,着实简单
int solve(int i, vector<int> &v, vector<int> &dp){
if(dp[i] != 0) return dp[i];
if(i == 0) {
dp[i] = 1;
}
else{
int mx = 0;
for(int j = 0; j < i; ++j){
int tmp = solve(j, v, dp);
if(v[i] <= v[j]) mx = max(tmp, mx);
}
dp[i] = mx+1;
}
return dp[i];
}
//求得最长严格上升子序列的长度,也很简单。
int up_solve(int i, vector<int>&v, vector<int>&dp2){
if(dp2[i] != 0) return dp2[i];
if(i == 0){
dp2[i] = 1;
}
else{
int mx = 0;
for(int j = 0; j < i; ++j){
int tmp = up_solve(j, v, dp2);
if(v[i] > v[j]) mx = max(tmp, mx);
}
dp2[i] = mx+1;
}
return dp2[i];
}
int main(){
int n;
cin>>n;
vector<int> v(n);
vector<int> dp(n);
vector<int> dp2(n);
for(int i = 0; i < n; ++i){
cin>>v[i];
}
solve(n-1, v, dp);
up_solve(n-1, v, dp2);
int ans1 = 0, ans2 = 0;
for(auto i : dp){
ans1 = max(ans1,i);
}
for(auto j: dp2){
ans2 = max(ans2, j);
}
cout<<ans1<<endl;
cout<<ans2<<endl;
return 0;
}