分析:最长公共递增子序列,把数据反向存储一遍,求正反两组数据的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; }
时间: 2024-12-28 11:51:03