zoukankan      html  css  js  c++  java
  • 合并回文子串 (区间 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
    ", ans);
    
    }
    
    
    int main() {
    
        int _; scanf("%d", &_);
        while(_--) solve();
    
    //    solve();
    
        return 0;
    }
  • 相关阅读:
    C 字符串
    C 函数指针、回调函数
    C 指针
    C 数组、枚举类型enum
    C 函数声明、函数参数
    C 内置函数
    C 流程控制
    C 储存类与运算符
    C变量和常量
    名词解释
  • 原文地址:https://www.cnblogs.com/Willems/p/13620841.html
Copyright © 2011-2022 走看看