区间dp-合并最长回文子串
牛客网:https://ac.nowcoder.com/acm/problem/13230
这道题目是经典问题最长回文子串的长度问题的拓展,原问题除了o(n^2)的dp还有马拉车算法,可以了解一下。
区间dp如果不是记忆化处理的话,应该列举区间的长度从小到大。
1 #include<bits/stdc++.h> 2 #include<stdio.h> 3 using namespace std; 4 #define N 101 5 char a[N], b[N]; 6 bool f[N][N][N][N]; 7 int t, n, m; 8 int main() 9 { 10 scanf("%d", &t); 11 while(t--) 12 { 13 int ans = 0; 14 scanf("%s", a+1); 15 scanf("%s", b+1); 16 n = strlen(a + 1); 17 m = strlen(b + 1); 18 for(int len1 = 0; len1 <= n; len1++) 19 for(int len2 = 0; len2 <= m; len2++) 20 for(int i = 1; i+len1-1 <= n; i++) 21 for(int k = 1; k+len2-1 <= m; k++) 22 { 23 int j = i+len1-1, l = k+len2-1; 24 if(len1+len2 <= 1) f[i][j][k][l] = 1; 25 else 26 { 27 f[i][j][k][l] = 0; 28 if(len1>1) f[i][j][k][l] |= (f[i+1][j-1][k][l] && (a[i]==a[j])); 29 if(len1 && len2) f[i][j][k][l] |= (f[i+1][j][k][l-1] && (a[i]==b[l])); 30 if(len1 && len2) f[i][j][k][l] |= (f[i][j-1][k+1][l] && (a[j]==b[k])); 31 if(len2>1) f[i][j][k][l] |= (f[i][j][k+1][l-1] && (b[k]==b[l])); 32 } 33 if(f[i][j][k][l]) 34 { 35 ans = max(ans, len1+len2); 36 } 37 } 38 printf("%d\n", ans); 39 } 40 return 0; 41 }

浙公网安备 33010602011771号