题解 | #合并回文子串#

合并回文子串

https://ac.nowcoder.com/acm/problem/13230

字符串c中价值最大的子串一定是由A中的某个子串和B中的某个子串组成的。
那么对于已知的dp[i][j][k][l]的状态,可以转移到取A字符串两边放到C字符串两边。
可以是取B字符串两边放到C字符串两边。
可以是取A字符串的右边和B字符串的左边来放到C字符串的两边
可以是取A字符串左边和B字符串的右边来放到C字符串的两边。
那么状态转移方程为:
// if (a[i]==a[j]) dp[i][j][k][l] |= dp[i+1][j-1][k][l];
// if (b[k]==b[l]) dp[i][j][k][l] |= dp[i][j][k+1][l-1];
// if (a[i]==b[l]) dp[i][j][k][l] |= dp[i+1][j][k][l-1];
// if (a[j]==b[k]) dp[i][j][k][l] |= dp[i][j-1][k+1][l];
//字符串c中价值最大的子串一定是由A中的某个子串和B中的某个子串组成的。
//那么对于已知的dp[i][j][k][l]的状态,可以转移到取A字符串两边放到C字符串两边。
//可以是取B字符串两边放到C字符串两边。
//可以是取A字符串的右边和B字符串的左边来放到C字符串的两边
//可以是取A字符串左边和B字符串的右边来放到C字符串的两边。
//那么状态转移方程为:
// if (a[i]==a[j]) dp[i][j][k][l] |= dp[i+1][j-1][k][l];
// if (b[k]==b[l]) dp[i][j][k][l] |= dp[i][j][k+1][l-1];
// if (a[i]==b[l]) dp[i][j][k][l] |= dp[i+1][j][k][l-1];
// if (a[j]==b[k]) dp[i][j][k][l] |= dp[i][j-1][k+1][l];
#include <bits/stdc++.h>

using namespace std;
const int maxn = 55;
int dp[maxn][maxn][maxn][maxn];
string a, b;

int main() {
    int T;
    cin>>T;
    while (T--) {
        cin>>a>>b;
        a = " "+a;b = " "+b;
        memset(dp, 0, sizeof(dp));
        int ans = 1;
        for (int x=0;x<=a.size()-1;x++) {
        	for (int y=0;y<=b.size()-1;y++) {
        		for (int i=1;i+x-1<=a.size()-1;i++) {
        			for (int k=1;k+y-1<=b.size()-1;k++) {
        				int j = i+x-1, l = k+y-1;
        				if (x+y<=1) {
        					dp[i][j][k][l] = 1;
						}
                        else {
//                             if (x>=3)
                            if (a[i]==a[j]) dp[i][j][k][l] |= dp[i+1][j-1][k][l];
                            if (b[k]==b[l]) dp[i][j][k][l] |= dp[i][j][k+1][l-1];
//                             if (x&&y) {
                                if (a[i]==b[l]) dp[i][j][k][l] |= dp[i+1][j][k][l-1];
                                if (a[j]==b[k]) dp[i][j][k][l] |= dp[i][j-1][k+1][l];
//                            }
                        }
//						
						if (dp[i][j][k][l]) {
							ans = max(ans, x+y);
						}
					}
				}
			}
		}
        cout<<ans<<endl;
    }
    
    
    return 0;
}


全部评论

相关推荐

来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
门口唉提是地铁杀:之前b站被一个游戏demo深深的吸引了。看up主页发现是个初创公司,而且还在招人,也是一天60。二面的时候要我做一个登录验证和传输文件两个微服务,做完要我推到github仓库,还要我加上jaeger和一堆运维工具做性能测试并且面试的时候投屏演示。我傻乎乎的做完以后人家跟我说一句现在暂时不招人,1分钱没拿到全是白干
你的秋招第一场笔试是哪家
点赞 评论 收藏
分享
每晚夜里独自颤抖:你cet6就cet6,cet4就cet4,你写个cet证书等是什么意思。专业技能快赶上项目行数,你做的这2个项目哪里能提现你有这么多技能呢
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务