题解 | #合并回文子串#

合并回文子串

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分钱没拿到全是白干
你的秋招第一场笔试是哪家
点赞 评论 收藏
分享
陈逸轩1205:才105 哥们在养生呢
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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