博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4512 HDOJ 吉哥系列故事——完美队形I --- 腾讯2013初赛第三场
阅读量:5286 次
发布时间:2019-06-14

本文共 993 字,大约阅读时间需要 3 分钟。

题目意思:给定一个序列,求最长回文子序列,满足从中点到两端依次递减。

先看LCIS最长公共上升子序列。

  dp[i]表示当前以下标i结束的最长公共上升子序列。

我们让第一个序列为原序列,第二个序列为原系列的反向。

则,也就是说,第二个序列的顺序为原序列的下标[n-1,0],设为j

当j枚举到k时,对于dp[0] ~ dp[k-1],都可以得到原序列的一个长度为2*dp[i]的题目要求的子序列。

可是对于,dp[k],我们怎么判断此时,两个序列是否存在交集呢?假如存在交集,此时题目要求的子序列长度为2*dp[k] - 1

这样考虑,假如此时的序列没有交集,则此时两个序列的最长公共上升子序列,在序列二中的起始坐标必然不是k

  那么它必然在j=[k+1,n-1]的时候已经出现过,并以dp[k]*2更新过ans

也就是说根本不用考虑嘛。。。直接将用dp[k]*2-1更新ans,答案并不会有错。

代码:

1 #include
2 #include
3 using namespace std; 4 int n,ans,a[201],dp[201]; 5 inline void Max(int &a,const int b){
if(b>a) a=b;} 6 int main() 7 { 8 int T; 9 scanf("%d",&T);10 while(T--){11 scanf("%d",&n);12 memset(dp,0,sizeof dp);13 for(int i=0;i
=0;k--){16 int x=a[k],mx=0;17 for(int i=0;i<=k;i++){18 if(a[i]

 

posted on
2013-03-22 23:16 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/hundundm/archive/2013/03/22/2976503.html

你可能感兴趣的文章
Python str转化成数字
查看>>
Pascal's Triangle II(帕斯卡三角形)
查看>>
hdu 1026 Ignatius and the Princess I
查看>>
进程间通信之Messager
查看>>
C++基础 const
查看>>
WSS 3.0部署备忘 三
查看>>
JavaScript学习笔记第一天——基本数据类型(值类型)和引用类型
查看>>
linux xargs 命令详解
查看>>
解决调整透明度后文字也透明的问题。
查看>>
SCIP 练习集
查看>>
在.NET Core控制台应用程序中使用强类型配置
查看>>
Matlab JPEG详细介绍
查看>>
NPOI导入excel
查看>>
Yarn资源调度管理
查看>>
JSON数据解析
查看>>
渗透资源大全
查看>>
jQuery简介
查看>>
作业3
查看>>
如鹏网 静态Web开发 第五章:JQuery
查看>>
sublime 常用快捷键
查看>>