题意:就是让你求出给定序列的最长的一个左右对称的并且左边递增右边递减的子序列。
思路:可以说是一个最长公共递增子序列的加强版,推荐你看下这个资料:http://www.clarkok.com/blog/?p=353,讲得挺好的,学会这个之后就是如何控制左右对称的问题了
代码实现:
#include<stdio.h> #include<string.h> int main() { int T,n,a[205],b[205],dp[205],i,j,k,max; scanf("%d",&T); while(T--) { max=-1; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); b[n-i+1]=a[i]; dp[i]=0; } dp[0]=0; for(i=1;i<=n;i++) { k=0; for(j=1;j<=n-i+1;j++)//j<=(n-i+1)这个地方要理解,具体的自己拿组数组测下 { if(a[i]==b[j]) { if(j!=(n-i+1))//不是自己和自己匹配了 { if(dp[j]<(dp[k]+2)) dp[j]=dp[k]+2; } else//自己和自己匹配了 { if(dp[j]<(dp[k]+1)) dp[j]=dp[k]+1; } } else if(a[i]>b[j]) { if(dp[k]<dp[j]) k=j; } if(max<dp[j]) max=dp[j]; } } printf("%d\n",max); } return 0; }