DP-怪盗基德的滑翔翼
进入题目
思路(主体)
分别向右和向左搜索,找到最大值
代码
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
void dp() //定义函数的方式方便重复调用
{
int n,Max_right=0,Max_left=0;
cin>>n;
vector<int>m(n+1),fr(n+1,1),fl(n+1,1); //定义容器,一个存序列,一个存序列长度
for(int i=0;i<n;i++)
cin>>m[i]; //输入
for(int i=n-1;i>=0;i--) //往右搜
{
for(int j=i+1;j<n;j++)
if(m[i]>m[j]&&fr[j]>=fr[i]) //找到当前阶段的最长序列
fr[i]=fr[j]+1;
if(fr[i]>fr[Max_right])Max_right=i; //记录最大值的下标
}
for(int i=0;i<n;i++) //往左搜
{
for(int j=i-1;j>=0;j--)
if(m[i]>m[j]&&fl[j]>=fl[i]) //找到当前阶段的最长序列
fl[i]=fl[j]+1;
if(fl[i]>fl[Max_left])Max_left=i; //记录最大值的下标
}
cout<<(fr[Max_right]>fl[Max_left]?fr[Max_right]:fl[Max_left])<<endl; //这里别忘了换行
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
dp(); //进入函数
return 0;
}