ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1026 合并回文子串 区间DP

2022-07-10 10:02:16  阅读:143  来源: 互联网

标签:子串 1026 int l2 && l1 DP 回文


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

题目描述

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

输入描述:

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

输出描述:

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

输入

复制
2
aa
bb
a
aaaabcaa

输出

复制
4
5

分析

合并回文子串,要求的是连续的子串是回文的,对于回文串,其实可以从小区间看到大区间,如果更小的一段区间是回文串,且最外面的两个数相等,那这个更大的区间也是回文子串

如果只有一个序列,写两层for循环的区间DP就可以了,由于有两个序列,序列的每个子序列都有可能,所以要四层for循环

状态方程:f[i][j][l][r] :表示第一个序列的区间[i,j] 第二个区间的[l][r] 是不是回文子串

状态转移方程式:f[i][j][l][r] |= f[i+1][j-1][l][r] (a[i] == a[j] ) 

//-------------------------代码----------------------------

//#define int LL
const int N = 60;
int n,m;
int f[N][N][N][N];
char a[N],b[N];

void solve()
{
cin>>a+1>>b+1;
int ans = 0;
int n = strlen(a+1);
int m = strlen(b+1);
for(int l1 = 0;l1<=n;l1 ++ ) {
for(int l2 = 0;l2<=m;l2++ ) {
for(int i = 1;i<=n - l1 + 1;i ++ ) {
for(int l = 1;l<= m - l2 + 1;l ++ ) {
int j = i + l1 - 1,r = l + l2 - 1;
if(l1 + l2 <= 1) f[i][j][l][r] = 1;
else {
f[i][j][l][r] = 0;
if(a[i] == a[j] && l1 >= 2) {
if(f[i+1][j-1][l][r]) f[i][j][l][r] = 1;
}
if(a[i] == b[r] && l1 && l2) {
if(f[i+1][j][l][r-1]) f[i][j][l][r] = 1;
}
if(b[l] == b[r] && l2 >= 2) {
if(f[i][j][l+1][r-1]) f[i][j][l][r] = 1;
}
if(b[l] == a[j] && l1 && l2) {
if(f[i][j-1][l+1][r]) f[i][j][l][r] = 1;
}
}
if(f[i][j][l][r]) ans = max(ans,l1 + l2);
}
}
}
}
cout<<ans<<endl;
}

signed main(){
clapping();TLE;

int t;cin>>t;while(t -- )
solve();
// {solve(); }
return 0;
}

/*样例区


*/

//------------------------------------------------------------

标签:子串,1026,int,l2,&&,l1,DP,回文
来源: https://www.cnblogs.com/er007/p/16462624.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有