题目大概:
给出一行数,从任意一个数出发,可以向两个方向走,但数字大小依次减小,求最长的一条路。
思路:
这个题一看和 登山 这道题差不多。
都是任选一个数,求两个方向最长上升子序列。
不过,这个题不是相加,而是取最大值。
最后,再寻找一下所有数的最长上升子序列的最大的一个。
感想:
好多题思路类似。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{int n;
int g,sum,sam;
int a[101]={0},b[101]={0},c[101]={0};
cin>>g;
for(int r=0;r<g;r++)
{
cin>>n;
for(int i=1;i<=n;i++)
{cin>>a[i];}
for(int y=1;y<=n;y++)
{int ma=0;
sum=0;sam=0;b[1]=1;
for(int i=2;i<=y;i++)
{
ma=0;
for(int t=1;t<i;t++)
{if(a[i]>a[t]){
if(b[t]>ma){ma=b[t];}
}
}
b[i]=ma+1;
}
c[n]=1;
for(int i=n-1;i>=y;i--)
{
ma=0;
for(int t=n;t>i;t--)
{if(a[i]>a[t]){
if(c[t]>ma){ma=c[t];}
}
}
c[i]=ma+1;
}
}
for(int i=1;i<=n;i++)
{if(sum<b[i])sum=b[i];
if(sam<c[i])sam=c[i];
}
int k;
k=max(sum,sam);
cout<<k<<endl;
}
return 0;
}