hdu 4512(最长公共递增子序列加强版)
2013-03-31 16:15
155 查看
题意:就是让你求出给定序列的最长的一个左右对称的并且左边递增右边递减的子序列。
思路:可以说是一个最长公共递增子序列的加强版,推荐你看下这个资料:http://www.clarkok.com/blog/?p=353,讲得挺好的,学会这个之后就是如何控制左右对称的问题了,开始的时候我是不会的,而是在经过大神的指教之后才会的,相见代码吧!!
代码实现:
思路:可以说是一个最长公共递增子序列的加强版,推荐你看下这个资料: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; }
相关文章推荐
- HDU 4512 最长公共上身子序列(加强)
- 最长递增公共子序列dp(hdu 1423 hdu 4512)
- HDU 4512 吉哥系列故事——完美队形I LCIS 最长递增公共子序列
- 最长公共子序列 最长递增子序列(和) 最长递增公共子序列 最长(连续)子序列乘积(HDU)--dp
- hdu 1423 最长递增公共子序列
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升序列)
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升序列)
- hdu 1423+hdu 4512 最长公共递增子序列
- [HDU 4512] 吉哥系列故事——完美队形I 最长上升公共子序列
- hdu 4512 吉哥系列故事——完美队形I(最长上升公共子序列)
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)
- HDU 1423 Greatest Common Increasing Subsequence 最长公共递增序列
- hdu1025 Constructing Roads In JGShining's Kingdom(最长递增公共子序列二分法)
- hdu 1423 Greatest Common Increasing Subsequence_LICS(最长公共递增子序列)
- 最长递增公共子序列
- HDU 1423 (最长上升公共子序列)
- HDU 1423 最长上升公共子序列
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离