区间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 }

 

posted @ 2020-03-27 11:55  tzy666  阅读(128)  评论(0)    收藏  举报