链接:https://ac.nowcoder.com/acm/problem/13230
来源:牛客网

题目描述

输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被组合成"axbycz"或"abxcyz"等。
我们定义字符串的价值为其最长回文子串的长度(回文串表示从正反两边看完全一致的字符串,如"aba"和"xyyx")。
需要求出所有可能的C中价值最大的字符串,输出这个最大价值即可

输入描述:

  1. 第一行一个整数T(T 50)。
  2. 接下来2T行,每两行两个字符串分别代表A,B(|A|,|B| 50),A,B的字符集为全体小写字母。

输出描述:

  1. 对于每组数据输出一行一个整数表示价值最大的C的价值。
示例1

输入

复制

  1. 2
  2. aa
  3. bb
  4. a
  5. aaaabcaa

输出

复制

  1. 4
  2. 5
  3.  
  4. 解题思路:单独考虑合成的回文串,我们可以知道这个回文串一定是由字符串A,字符串B合成的,并且来自字符串A的字符相对位置没有变化,来自字符串B的字符的相对位置也没有变化。假设Abe1】【en1】为字符串Ai】(be1<=i<=en1),Bbe2】【en2
    为字符串Bi】(be2<=i<=en2),如果这两个字符串能组成回文,设dpbe1】【en1】【be2】【en2】为1,回文的长度为en1-be1+1+en2-be2+1,如果不能构成回文那么dpbe1】【en1】【be2】【en2】为0
    经过分析,dpbe1】【en1】【be2】【en2】可能由四种状态转移而来。
    1. dpbe1+1】【en1-1】【be2】【en2】(此时回文串的最左边的字符为Abe1】,最右边的字符为Aen1】)
    2. dpbe1+1】【en1】【be2】【en2-1 (此时回文串的最左边的字符为Abe1】,最右边的字符为Ben2】)
    3.dpbe1】【en1-1】【be2+1】【en2】(此时回文串的最左边的字符为Bbe2】,最右边的字符为Aen1】)
    4.dpbe1】【en1】【be2+1】【en2-1】(此时回文串的最左边的字符为Bbe2】,最右边的字符为Ben2】)
    同时也需要注意边界的处理
  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<vector>
  6. #include<stack>
  7. #include<cstdio>
  8. #include<map>
  9. #include<set>
  10. #include<string>
  11. #include<queue>
  12. using namespace std;
  13. #define inf 0x3f3f3f3f
  14. #define ri register int
  15. typedef long long ll;
  16.  
  17. inline ll gcd(ll i,ll j){
  18. return j==0?i:gcd(j,i%j);
  19. }
  20. inline ll lcm(ll i,ll j){
  21. return i/gcd(i,j)*j;
  22. }
  23. inline void output(int x){
  24. if(x==0){putchar(48);return;}
  25. int len=0,dg[20];
  26. while(x>0){dg[++len]=x%10;x/=10;}
  27. for(int i=len;i>=1;i--)putchar(dg[i]+48);
  28. }
  29. inline void read(int &x){
  30. char ch=x=0;
  31. int f=1;
  32. while(!isdigit(ch)){
  33. ch=getchar();
  34. if(ch=='-'){
  35. f=-1;
  36. }
  37. }
  38. while(isdigit(ch))
  39. x=x*10+ch-'0',ch=getchar();
  40. x=x*f;
  41. }
  42. int dp[55][55][55][55];
  43. int main(){
  44. char st1[55],st2[55];
  45. int t;
  46. scanf("%d",&t);
  47. while(t--){
  48.  
  49. scanf("%s%s",st1+1,st2+1);
  50.  
  51. int len1=strlen(st1+1);
  52. int len2=strlen(st2+1);
  53. int ans=1;
  54. for(int i=0;i<=len1;i++){//回文串来自st1的长度
  55. for(int j=0;j<=len2;j++){//来自st2的长度
  56. for(int be1=1,en1=i+be1-1;en1<=len1;be1++,en1++){//起点为be1 终点 为en1
  57. for(int be2=1,en2=j+be2-1;en2<=len2;be2++,en2++){//起点be2 终点为 en2
  58. dp[be1][en1][be2][en2]=0;
  59. if((i+j)<=1){
  60. dp[be1][en1][be2][en2]=1;//边界处理
  61. }
  62. else{
  63. if(st1[be1]==st1[en1]&&(en1>0))dp[be1][en1][be2][en2]|=dp[be1+1][en1-1][be2][en2];
  64. if(st1[be1]==st2[en2]&&(en2>0))dp[be1][en1][be2][en2]|=dp[be1+1][en1][be2][en2-1];
  65. if(st1[en1]==st2[be2]&&(en1>0))dp[be1][en1][be2][en2]|=dp[be1][en1-1][be2+1][en2];
  66. if(st2[be2]==st2[en2]&&(en2>0))dp[be1][en1][be2][en2]|=dp[be1][en1][be2+1][en2-1];
  67. }
  68. if(dp[be1][en1][be2][en2]){//st1[be1]~[en1]与st2[be2]~[en2]可组成回文串
  69. ans=max(ans,en1-be1+en2-be2+2);
  70. }
  71. }
  72. }
  73. }
  74. }
  75. cout<<ans<<endl;
  76. }
  77. return 0;
  78. }

  

合并回文子串(区间dp)的更多相关文章

  1. nowcoder 合并回文子串

    链接:https://www.nowcoder.com/acm/contest/6/C来源:牛客网题目输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如"abc&q ...

  2. (最长回文子串 线性DP) 51nod 1088 最长回文子串

    输入一个字符串Str,输出Str里最长回文子串的长度. 回文串:指aba.abba.cccbccc.aaaa这种左右对称的字符串. 串的子串:一个串的子串指此(字符)串中连续的一部分字符构成的子(字符 ...

  3. 最长回文子序列/最长回文子串(DP,马拉车)

    字符子串和字符子序列的区别 字符字串指的是字符串中连续的n个字符:如palindrome中,pa,alind,drome等都属于它的字串 而字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符: ...

  4. uva 10453 【回文串区间dp】

    Uva 10453 题意:给定字符串,问最少插入多少个字符使其变成回文串,并任意输出一种结果. 题解:和Uva 10739类似,这里是只能增加.类似定义dp[i][j]表示子串Si...Sj变为回文串 ...

  5. leetcode 730. 统计不同回文子序列(区间dp,字符串)

    题目链接 https://leetcode-cn.com/problems/count-different-palindromic-subsequences/ 题意 给定一个字符串,判断这个字符串中所 ...

  6. poj3280 Cheapest Palindrome(回文串区间dp)

    https://vjudge.net/problem/POJ-3280 猛刷简单dp第一天第三题. 这个据说是[求字符串通过增减操作变成回文串的最小改动次数]的变体. 首先增减操作的实质是一样的,所以 ...

  7. nyoj 1023——还是回文——————【区间dp】

    还是回文 时间限制:2000 ms  |  内存限制:65535 KB 难度:3   描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一 ...

  8. bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文【区间dp】

    只要发现添加一个字符和删除一个字符是等价的,就是挺裸的区间dp了 因为在当前位置加上一个字符x就相当于在他的对称位置删掉字符x,所以只要考虑删除即可,删除费用是添加和删除取min 设f[i][j]为从 ...

  9. 美团2017年CodeM大赛-初赛A轮 C合并回文子串

    区间dp一直写的是递归版本的, 竟然超时了, 学了一下非递归的写法. #include <iostream> #include <sstream> #include <a ...

随机推荐

  1. 通过google cloud API 使用 WaveNet

    Cloud Text-to-Speech 中使用了WaveNet,用于TTS,页面上有Demo.目前是BETA版 使用方法 注册及认证参考:Quickstart: Text-to-Speech 安装g ...

  2. The usage of docker image wurstmeister/kafka

    The docker image wurstmeister/kafka is the most stared image for kafka in hub.docker.com, but the us ...

  3. Jq写个联级菜单

    这个效果很好看,Jq很容易实现: $(document).ready(function(){ $('.menu li').hover(function(){ $(this).children('ul' ...

  4. python pdfkit html转pdf响应式轮子 django例

    pip install pdfkit 本例用django做的请求,换成对应框架即可 此方法可将html页面转成pdf下载 #!/usr/bin/env python # coding:utf-8 im ...

  5. 批量查杀该死的VBscript “svchost.exe” 脚本挂马

    今天写代码突然发现HTML文件最后多了一段VBscript代码: <SCRIPT Language=VBScript><!-- DropFileName = "svchos ...

  6. [持续交付实践] pipeline使用:Shared Libraries

    前言 随着pipeline交付流水线在团队中的推广,使用pipeline脚本的job也迅速增加.虽然我们已经基于公司的技术栈特点做了一个尽可能通用的pipeline脚本样例,让搭建者只需要修改几个赋值 ...

  7. 【学习】数据聚合和分组运算【groupby】

    分组键可以有多种方式,且类型不必相同 列表或数组, 某长度与待分组的轴一样 表示DataFrame某个列名的值 字典或Series,给出待分组轴上的值与分组名之间的对应关系 函数用于处理轴索引或索引中 ...

  8. Oracle从入门到精通----学习笔记

    书名:<Oracle从入门到精通:视频实战版>秦靖.刘存勇等编著 第4章 SQL基础 1.SQL语言分类 数据定义语言 --- DDL,Data Definition Language 数 ...

  9. Eclipse识别不了jsp中的${pageContxt.request.contextPath }

    按计划这周系统学下Struts,但是搭完框架后jsp页面识别不了${pageContxt.request.contextPath } So这篇就记录一下我是怎么解决这个问题的 不管是tomcat7.0 ...

  10. 1. vs code 设置快捷键与eclipse一样

    keybindings.json文件路径在:C:\Users\Administrator\AppData\Roaming\Code\User\keybindings.json { "key& ...