题意:

如果一个字符串等于s和t的长度之和(\(l \le 50\)),并且可以拆成两个字符串子序列,分别与s和t相同,那么它就是s和t的一个并字符串(从字符串中选出若干个可以不连续的字符按照原序列写出来形成的新字符串)。定义趣味串为s和t的并字符串的任意一个回文子串,求所有趣味串的长度最大值。

分析:

首先暴力方法就是dfs + manacher枚举所有并字符串。

正解:因为l小于等于50,所以可以使用\(n^4\)的算法:设dp[a][b][c][d]表示取出S的前a个字符、T的前b个字符、S的后c个字符、T的后d个字符形成的回文串最大长度。

  • 对于偶回文串,下面几种情况可以更新:
  1. s[a] = s[c]
  2. t[b] = t[d]
  3. s[a] = t[d]
  4. s[c] = t[b]
  • 对于奇回文串:当且仅当某一个串已经取完,且另一个串剩下最后一个时,将剩下的这个插入,就可以形成奇回文串。

code

#include<bits/stdc++.h>
using namespace std;
const int N = 55;
int dp[N][N][N][N];
int lenS, lenT, ans = 0;
char s[N], t[N]; int main(){
// freopen("h.in", "r", stdin);
scanf("%s", s + 1), scanf("%s", t + 1);
lenS = strlen(s + 1), lenT = strlen(t + 1);
for(int a = 1; a <= lenS + 1; a++)
for(int b = 1; b <= lenT + 1; b++)
for(int c = lenS + 1; c >= 1; c--)
for(int d = lenT + 1; d >= 1; d--){
int e = dp[a][b][c][d];
if(a < c && s[a] == s[c] && e + 2 > dp[a + 1][b][c - 1][d])
dp[a + 1][b][c - 1][d] = e + 2;
if(b < d && t[b] == t[d] && e + 2 > dp[a][b + 1][c][d - 1])
dp[a][b + 1][c][d - 1] = e + 2;
if(a <= c && b <= d){
if(s[a] == t[d] && e + 2 > dp[a + 1][b][c][d - 1])
dp[a + 1][b][c][d - 1] = e + 2;
if(s[c] == t[b] && e + 2 > dp[a][b + 1][c - 1][d])
dp[a][b + 1][c - 1][d] = e + 2;
}
}
for(int a = 1; a <= lenS + 1; a++)
for(int b = 1; b <= lenT + 1; b++)
for(int c = lenS + 1; c >= 0; c--)
for(int d = lenT + 1; d >= 0; d--){
int e = dp[a][b][c][d];
if(a == c && b > d) ans = max(ans, e + 1);
if(a > c && b == d) ans = max(ans, e + 1);
if(a > c && b > d) ans = max(ans, e);
}
cout<<ans;
return 0;
}

最新文章

  1. SSH隧道应用, 突破网络限制
  2. js方法入参或局部变量和全局变量重名,用来赋值全局变量会失败
  3. Ubuntu下用wireshark抓取802.11封包并进行过滤分析
  4. Python正则表达式模块(re模块)
  5. 动手学习TCP: 环境搭建
  6. thinkphp中page方法
  7. mysql之触发器before和after的区别
  8. 从网站上复制代码到MyEclipse后每行都是字符编码错误的解决办法
  9. PHP中英文字符串截取函数无乱码(mb_substr)和获取中英文字符串字数函数(mb_strlen)
  10. 内存分析_.Net垃圾回收介绍
  11. PHP定时执行任务的实现(转)
  12. (转载)mysql中百万级数据插入速度测试
  13. eclipse中tomcat的add and Remove找不到项目
  14. Interesting (manacher + 前缀和处理)
  15. python kafka client--confluent-kafka-python
  16. ReactJS实用技巧(2):从新人大坑——表单组件来看State
  17. python测试开发django-27.表单提交之post修改密码
  18. Java Nashorn--Part 2
  19. 【转】【WCF】WCF中客户端生成代理的两种方式
  20. 第六篇:Eclipse上运行第一个Hadoop实例 - WordCount(单词统计程序)

热门文章

  1. 洛谷 P2067 Cytus-Holyknight
  2. ubuntu下useradd与adduser差别,新建用户不再home文件夹下
  3. 【天气APP】之桌面时钟witget组件
  4. 86.八千万qq密码按相似度排序并统计密码出现次数,生成密码库
  5. 前端面试题(计算机网络/http/https)
  6. Docker---(6)问题:bash: vi: command not found
  7. Java Web学习总结(4)——HttpServletResponse对象入门
  8. hbase单机安装和简单使用
  9. 【Educational Codeforces Round 31 A】Book Reading
  10. Python 在线笔试