您的位置:首页 > 其它

hdu 4512(最长公共递增子序列加强版)

2013-03-31 16:15 155 查看
题意:就是让你求出给定序列的最长的一个左右对称的并且左边递增右边递减的子序列。

思路:可以说是一个最长公共递增子序列的加强版,推荐你看下这个资料: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: