分析:最长公共递增子序列,把数据反向存储一遍,求正反两组数据的LCIS。另外注意边界的条件判断。还有如果取出的新队列有奇数个人或偶数个人要单独判断。
#include<iostream>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
int dp[202];
int a[202];
int b[202];
int LCIS(int n)
{
int i,j,maxlen,ans;
memset(dp,0,sizeof(dp));
ans=0;
for(i=1;i<=n;i++)
{
maxlen=0;
for(j=1;j<=n-i+1;j++) //j<=n-i+1保证中间最多重复一人
{
if(a[i]>b[j])
maxlen=max(maxlen,dp[j]);
else if(a[i]==b[j])
dp[j]=maxlen+1;
if(i<n-j+1) //是否重叠
ans=max(ans,dp[j]*2);
else
ans=max(ans,dp[j]*2-1);
}
}
return ans;
}
int main()
{
int T,n,i;
cin>>T;
while(T--)
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
b[n-i+1]=a[i]; //逆序存储
}
cout<<LCIS(n)<<endl;
}
return 0;
}HDU ACM 4512 吉哥系列故事——完美队形I ->LCIS最长公共递增子序列
原文地址:http://blog.csdn.net/a809146548/article/details/45501379