合并回文子串 (区间 dp,最长回文子序列)

题目:传送门

题意

 

 思路

邓老师精讲

#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define UI unsigned int
#define mem(i, j) memset(i, j, sizeof(i))
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define dep(i, j, k) for(int i = k; i >= j; i--)
#define pb push_back
#define make make_pair
#define INF 0x3f3f3f3f
#define inf LLONG_MAX
#define PI acos(-1)
#define fir first
#define sec second
#define lb(x) ((x) & (-(x)))
#define dbg(x) cout<<#x<<" = "<<x<<endl;
using namespace std;

const int N = 1e6 + 5;

char a[101], b[101];

int dp[101][101][101][101];

void solve() {

    scanf("%s", a + 1);

    scanf("%s", b + 1);

    int lena = strlen(a + 1);

    int lenb = strlen(b + 1);

    int ans = 0;

    for(int la = 0; la <= lena; la++) { /// a区间长度

        for(int lb = 0; lb <= lenb; lb++) { /// b区间长度

            for(int i = 1; i + la - 1 <= lena; i++) {

                for(int k = 1; k + lb - 1 <= lenb; k++) {

                    int j = i + la - 1, l = k + lb - 1;

                    if(la + lb <= 1) dp[i][j][k][l] = 1;

                    else {

                        dp[i][j][k][l] = 0;

                        if(la > 1) dp[i][j][k][l] |= (dp[i + 1][j - 1][k][l] && (a[i] == a[j]));

                        if(la && lb) dp[i][j][k][l] |= (dp[i + 1][j][k][l - 1] && (a[i] == b[l]));

                        if(la && lb) dp[i][j][k][l] |= (dp[i][j - 1][k + 1][l] && (a[j] == b[k]));

                        if(lb > 1) dp[i][j][k][l] |= (dp[i][j][k + 1][l - 1] && (b[k] == b[l]));

                    }

                     if(dp[i][j][k][l]) ans = max(ans, la + lb);

                }

            }

        }

    }

    printf("%d\n", ans);

}


int main() {

    int _; scanf("%d", &_);
    while(_--) solve();

//    solve();

    return 0;
}

 

posted on 2020-09-06 10:06  Willems  阅读(179)  评论(0编辑  收藏  举报

导航