HDU 4745 最长回文子序列
题目大意
两只青蛙朝不同方向条,每次都到达值相同的位置,不能重复到达自己到过的地方,且不能飞跃已到过的地方
我们可以理解为这两只青蛙分别把整个序列遍历了一遍,依次走过所有的点,找到最多相同的点的个数,因为朝不同方向,且形成环,所以可以把数组扩大两倍,写两组一样的数组
每次跳完得到的必然可以理解为是一个回文子序列
这里有个例外,就是在已形成的回文子序列下 要是还有多出的点是可以加一的,因为可以令两只青蛙同时在这一点出发再去遍历回文串
DP过程
//DP过程是先从前后两个数距离范围最小的1开始,不断扩大距离,这样可以利用前面小范围来更新大范围
//i在这里可以理解为2个数的距离
for(int i=1;i<n;i++){
for(int j=1;j<=n;j++){
if(a[j] == a[j+i]){
dp[j][j+i] = max(dp[j+1][i+j-1]+2,dp[j][j+i]);
}
else
dp[j][j+i] = max(dp[j+1][j+i],dp[j][j+i-1]);
}
}
然后在范围为n-1的dp值中找最大值
和n-2的范围的dp+1中找最大值
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int N = ;
- int a[N],n;
- int dp[N][N];
- int main()
- {
- while(~scanf("%d",&n)){
- if(n==)
- break;
- for(int i=;i<=n;i++){
- scanf("%d",a+i);
- a[n+i] = a[i];
- }
- memset(dp,,sizeof(dp));
- for(int i=;i<=*n;i++)
- dp[i][i] = ;
- //DP过程是先从前后两个数距离范围最小的1开始,不断扩大距离,这样可以利用前面小范围来更新大范围
- //i在这里可以理解为2个数的距离
- for(int i=;i<n;i++){
- for(int j=;j<=n;j++){
- if(a[j] == a[j+i]){
- dp[j][j+i] = max(dp[j+][i+j-]+,dp[j][j+i]);
- }
- else
- dp[j][j+i] = max(dp[j+][j+i],dp[j][j+i-]);
- }
- }
- int maxn = ;
- for(int i=;i<=n;i++)
- maxn = max(maxn,dp[i][i+n-]);
- for(int i=;i<=n;i++)
- maxn=max(maxn,dp[i][i+n-]+);
- printf("%d\n",maxn);
- }
- return ;
- }
HDU 4745 最长回文子序列的更多相关文章
- HDU 4745 Two Rabbits ★(最长回文子序列:区间DP)
题意 在一个圆环串中找一个最长的子序列,并且这个子序列是轴对称的. 思路 从对称轴上一点出发,向两个方向运动可以正好满足题意,并且可以证明如果抽选择的子环不是对称的话,其一定不是最长的. 倍长原序列, ...
- hdu 3068 最长回文 manacher算法(视频)
感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...
- hdu 3068 最长回文(manachar求最长回文子串)
题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...
- HDU - 3068 最长回文(manacher)
HDU - 3068 最长回文 Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Subm ...
- 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )
1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblo ...
- NOIP2016提高组初赛(2)四、读程序写结果3、求最长回文子序列
#include <iostream> using namespace std; int lps(string seq, int i, int j) { int len1, len2; i ...
- 最长回文子序列(LPS)
问题描述: 回文是正序与逆序相同的非空字符串,例如"civic"."racecar"都是回文串.任意单个字符的回文是其本身. 求最长回文子序列要求在给定的字符串 ...
- [LeetCode] Longest Palindromic Subsequence 最长回文子序列
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- [Swift]LeetCode516. 最长回文子序列 | Longest Palindromic Subsequence
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
随机推荐
- 225 Implement Stack using Queues 队列实现栈
Implement the following operations of a stack using queues. push(x) -- Push element x onto stack.pop ...
- AJPFX编写cmd界面下一键编译、执行java代码的bat脚本
此脚本适合刚接触java的同学,在cmd界面下用jc取代 复杂的 javac *.java + java main使用说明:把脚本内容复制到txt文本中,修改后缀名为.bat,运行一次即可完成配置, ...
- 《基于Node.js实现简易聊天室系列之总结》
前前后后完成这个聊天室的Demo花了大概一个星期,当然一个星期是仅仅指编码的工作.前期的知识储备是从0到1从无到有,花费了一定的时间熟悉Node.js的基本语法以及Node.js和mongoDB之间的 ...
- php中 mysql 插入特殊字符(手机端的emoji表情)出现异常
今天在用mysql存储从微信服务器拉来的数据,出现插入数据异常,报 Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F 的错误. 最终在网上查了一下,有 ...
- Android Studio 导入新工程项目
1 导入之前先修改工程下相关文件 1.1 只需修改如下三个地方1.2 修改build.gradle文件 1.3 修改gradle/wrapper/gradle-wrapper.properties 1 ...
- CCF|游戏|Java
import java.util.Scanner; public class tyt { public static void main(String[] args) { Scanner in = n ...
- idea 部署struts所遇到的问题\
1.org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter 加载失败 解决方法:下载struts2 的源码包,然后将D:\ ...
- 关于AMAZON SES设置的一些要点
1.首先要有一个企业邮箱,如果没有可以去腾讯(http://exmail.qq.com/onlinesell/intro)申请一个,网易也有,不过解析几次搞了两天都是未通过,腾讯几分钟就好了 企业邮箱 ...
- pdf 使用模板下载
//根据模板下载模板 /** * * 政策5-8条的创建的pdf的模板 */public String createPdfCashTemplate(PdfCashParam pdfCashParam) ...
- 01Oracle Database
Oracle Database Oracle Database又名Oracle RDBMS简称Oracle是甲骨文公司的一款关系数据库管理系统. Oracle Website.