合并回文子串 (区间 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; }
一步一步,永不停息