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;
}
posted @ 2021-04-17 09:29  xihale  阅读(67)  评论(0编辑  收藏  举报