题解 | 拦截导弹
拦截导弹
https://www.nowcoder.com/practice/218f3db1f66d465bbf9578625aa90785
#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false), cin.tie(0);
typedef long long LL;
//const int N=;
int n;
int main()
{
IOS
cin>>n;
vector<int> a(n), f(n, 1), dp(n, 1);
for(int i=0; i<n; i++) cin>>a[i];
for(int i=0; i<n; i++)
for(int j=0; j<i; j++)
if(a[i]>a[j]) f[i]=max(f[i], f[j]+1);
else dp[i]=max(dp[i], dp[j]+1);
int ans=0, res=0;
for(int i=0; i<n; i++) ans=max(ans, f[i]), res=max(res, dp[i]);
cout<<res<<"\n"<<ans;
return 0;
}
根据Dilworth定理:最少的下降序列个数就等于整个序列最长上升子序列的长度
数据范围比较小,双重for循环即可,当然也可以二分优化
查看4道真题和解析