码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-11-11 16:41:06      阅读:7      评论:0      收藏:0      [点我收藏+]

标签:ret   inline   区间dp   void   ref   oid   第一个   line   amp   

题目链接

题目大意

??略

解题思路

??最大回文子串的变形。用dp[i][j][k][l]表示第一个字符串第\(i~j\)这个子段和第二个字符串j~k这个子段形成的回文串是否存在,因为两个字符串的组合一共有四种方式,所以转移方式有四种:
??1.只有第一个字符串且\(s1[i]==s1[j], dp[i][j][k][l] |= dp[i+1][j-1][k][l]\).
??1.只有第二个字符串且\(s2[k]==s2[l], dp[i][j][k][l] |= dp[i][j][k+1][l-1]\).
??3.两个字符串相交且第一个字符串在第二个字符串前面且\(s1[i]==s2[j]\)
??\(dp[i][j][k][l] |= dp[i+1][j][k][l-1]\)
??4.两个字符串相交且第二个字符串在第一个字符串前面且\(s1[j]==s2[k]\)
??\(dp[i][j][k][l] |= dp[i][j-1][k+1][l]\)
??边界情况就是只有一个字符的时候,这个时候肯定是成立的所以直接设成1就行了。

代码

const int maxn = 1e2+10;
const int maxm = 1e4+10;
bool dp[maxn][maxn][maxn][maxn];
char s1[maxn], s2[maxn];
int main(void) {
    int T; cin >> T;
    while(T--) {
        cin >> (s1+1) >> (s2+1);
        int ans = 0;
        int n = strlen(s1+1), m = strlen(s2+1);
        for (int len1 = 0; len1<=n; ++len1)
            for (int len2 = 0; len2<=m; ++len2)
                for (int i = 1; i+len1-1<=n; ++i)
                    for (int k = 1; k+len2-1<=m; ++k) {
                        int j = i+len1-1, l = k+len2-1;
                        if (len1+len2 <= 1) dp[i][j][k][l] = 1;
                        else {
                            dp[i][j][k][l] = 0;
                            if (len1>1 && s1[i]==s1[j]) dp[i][j][k][l] |= dp[i+1][j-1][k][l];
                            if (len2>1 && s2[k]==s2[l]) dp[i][j][k][l] |= dp[i][j][k+1][l-1];                            
                            if (len1 && len2 && s1[i]==s2[l]) dp[i][j][k][l] |= dp[i+1][j][k][l-1];
                            if (len1 && len2 && s1[j]==s2[k]) dp[i][j][k][l] |= dp[i][j-1][k+1][l];                             
                        }
                        if (dp[i][j][k][l]) ans = max(ans, len1+len2);
                    }
        cout << ans << endl;
    }
    return 0;
}

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

标签:ret   inline   区间dp   void   ref   oid   第一个   line   amp   

原文地址:https://www.cnblogs.com/shuitiangong/p/13767750.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!