NC13230 合并回文子串(区间dp)

从数据范围不难推出可以用f[][][][],表示由两个字符串来表示的最长大小

并且因为是回文串,所以我们要向头尾加字符,来变大,因为这个是回文子串,也就是连续的一段。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
const int N=55;
char s1[55],s2[55];
int f[N][N][N][N];
int main(){
    int t;
    cin>>t;
    while(t--){
        scanf("%s%s",s1+1,s2+1);
        int n=strlen(s1+1);int m=strlen(s2+1);
        int len1,len2,l1,l2;
        int res=1;
        for(len1=0;len1<=n;len1++){
            for(len2=0;len2<=m;len2++){
                for(l1=1;l1+len1-1<=n;l1++){
                    for(l2=1;l2+len2-1<=m;l2++){
                       int r1=l1+len1-1;
                       int r2=l2+len2-1;
                        if(len1+len2<=1){
                            f[l1][r1][l2][r2]=1;
                        }
                        else{
                            f[l1][r1][l2][r2]=0;
                            if(len1>1&&s1[l1]==s1[r1])
                                f[l1][r1][l2][r2]|=f[l1+1][r1-1][l2][r2];
                            if(len2>1&&s2[l2]==s2[r2])
                                f[l1][r1][l2][r2]|=f[l1][r1][l2+1][r2-1];
                            if(len1&&len2&&s1[l1]==s2[r2])
                                f[l1][r1][l2][r2]|=f[l1+1][r1][l2][r2-1];
                            if(len1&&len2&&s1[r1]==s2[l2])
                                f[l1][r1][l2][r2]|=f[l1][r1-1][l2+1][r2];
                        }
                        if(f[l1][r1][l2][r2])
                            res=max(res,r1-l1+1+r2-l2+1);
                    }
                }
            }
        }
        cout<<res<<endl;
    }
}

原文地址:https://www.cnblogs.com/ctyakwf/p/12562610.html

时间: 2024-10-27 21:45:37

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

UVa 10617 Again Palindrome(回文串区间DP)

UVa 10617 Again Palindrome(经典回文串区间DP) 题意: 给定一个字符串s,对s进行删除操作,使得剩下的子串是回文字符串,问最多有多少种这种子串. 思路: 涉及到回文字符串,首先要想到的肯定是区间DP,如何写出状态转移方程? 直接从题意切入:dp[i, j]表示区间[i, j]最多有多少个这样的子串. 1. s[i] == s[j] 去掉s[i],则一个子问题就是dp[i+1, j]; 去掉s[j],另一个子问题就是dp[i, j-1]; 显然这两个子问题是会有重叠的,

回文串区间dp

UVa 10739 String to Palindrome(经典回文串区间DP) 题意: 给定一个字符串,可以对其进行删除,插入,替换操作. 问最少经过几次操作,可以使这个字符串变成回文字符串. 思路: 看得别人的 题解,最优化问题,用较为直接的方法处理时发现情况很复杂,很多时候就要考虑动态规划了.先从整体出发,由大到小,看往少一个两个元素的情况进行最优递归,如何得到结果. (这里区间DP即是不断向两侧扩大规模) (1)如果最外层两个字符相同,s[0]==s[n],那么这两个字符外侧肯定不用考

最长回文子序列 区间dp

J - 买票回家啦 Time Limit:1000MS    Memory Limit:65535KB    64bit IO Format: SubmitStatusPracticeNBUT 1586 Description 集训要结束了,同学们就准备回家了.好舍不得回家阿.(那就再待一个月嘛,就这么愉快地决定了.)超哥要回家了,可是他没有挤进12306官网, 可怜的他就随便找了个能代购车票的网站.结果,当他付钱时傻眼了,这个网站竟然要验证码.验证码嘛就照着样子输入就好了呀,哦不,这个网站管理

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

只要发现添加一个字符和删除一个字符是等价的,就是挺裸的区间dp了 因为在当前位置加上一个字符x就相当于在他的对称位置删掉字符x,所以只要考虑删除即可,删除费用是添加和删除取min 设f[i][j]为从i到j的价格,长度从小到大枚举更新就行了 f[i][j]=min(f[i][j-1]+cost[s[j]],f[i+1][j]+cost[s[i]]),如果s[i]==s[j]还能和f[i+1][j-1]取个min cpp #include<iostream> #include<cstdio

最长回文子串(Longest Palindromic Substring)-DP问题

问题描述: 给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 . 思路分析: 动态规划的思路:dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串. 则根据回文的规则我们可以知道: 如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1] 当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false. 动态规划的进行是按照字符串的长度从1 到 n推进的. DP算法实现: 1 packa

编程之美资格赛 第二题 回文字符序列 dp

这是一道dp题,设置dp[i][j]代表的是从i到j之间的有多少个回文子串,dp[i][j] = dp[i][num[1]] +1+ dp[num[1]+1][j - 1]+1......+dp[num[j]][j-1] + 1 ,num[i] 代表的是与i字符相同的上一个字符的位置! 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串aba中,回文子序列为"a", &quo

Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc" 输出: 3 解释: 三个回文子串: "a", "b", "c". 示例 2: 输入: "aaa" 输出: 6 说明: 6个回文子串: "a", "a", "a", &quo

[LeetCode]647. 回文子串(DP)

题目 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc" 输出: 3 解释: 三个回文子串: "a", "b", "c". 示例 2: 输入: "aaa" 输出: 6 说明: 6个回文子串: "a", "a", "a", &

URAL-1297 Palindrome (最长回文子串)

Palindrome Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Description The “U.S. Robots” HQ has just received a rather alarming anonymous letter. It states that the agent from the competing «Robots Unlimited» has infiltrat