此题需要写两个函数,最长上升序列的长度和最长不上升序列的长度。
LCS函数(计算最长不下降序列的长度,动态规划的思路:首先数组里面的长度都初始化为1,然后开始遍历数组,计算以当前i为最低值时的最长不上升序列的长度,计算的时候再设置一个FOR循环遍i之前的所有值,如果i之前有值大于等于i的值P,那么就是说,i的值可以是P的长度加1。所以最长的长度就是整个0-i 区间里面长度最大的。
这个题还有一个注意点就是,最少需要多少拦截系统,那么就等于最长上升序列的长度。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>
using namespace std;
long long num[3000];
long long x[3000];
long long y[3000];
void LCS(long long k)
{
for(int i=0;i<k;i++)
num[i]=1;
for(int i=0;i<k;i++)
{
long long maxn = -100;
for(int j=0;j<i;j++)
{
if(x[i]<=x[j]&& maxn<num[j]+1)
{
maxn = num[j]+1;
}
}
if(maxn>num[i])
num[i] = maxn;
}
}
void LL(long long k)
{
for(int i=0;i<k;i++)
y[i]=1;
for(int i=0;i<k;i++)
{
long long maxn = -100;
for(int j=0;j<i;j++)
{
if(x[i]>x[j]&& maxn<y[j]+1)
{
maxn = y[j]+1;
}
}
if(maxn>y[i])
y[i] = maxn;
}
}
int main()
{
long long k=0;
while(cin >> x[k++]);
LCS(k-1);
LL(k-1);
long long ans1 = 0;
for(int i=0;i<k-1;i++)
ans1 = max(ans1,num[i]);
long long ans2 = -1000;
for(int i=0;i<k-1;i++)
ans2 = max(ans2,y[i]);
cout<<ans1<<endl<<ans2<<endl;
return 0;
}