HDU-2205 又见回文

又见回文(区间dp)

题目:

图片说明

题解:

可知只有当第一个串的头部和第一个串的尾部、第二个串的头部和第二个串的尾部、第一个串的头部和第二个串的尾部、第一个串的尾部和第二个串的头部四种情况才会使得回文的长度增长。因此,布尔型变量用表示串从,从能否组成新串,初始化为,则采取区间动态规划,每次更新最大值即可

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
const ll mod = 998244353;
char a[55], b[55];
bool dp[55][55][55][55];
int main()
{
    while (gets(a + 1) && gets(b + 1))
    {
        int len1 = strlen(a + 1);
        int len2 = strlen(b + 1);
        memset(dp, 0, sizeof(dp));
        for (int i = 1; i <= len1 + 1; i++)
            for (int j = 1; j <= len2 + 1; j++)
                dp[i][i][j][j - 1] = dp[i][i - 1][j][j] = dp[i][i - 1][j][j - 1] = 1;
        int ans = 0;
        for (int l1 = 0; l1 <= len1; l1++)
            for (int l2 = 0; l2 <= len2; l2++)
                for (int i = 1, j = i + l1 - 1; j <= len1; i++, j++)
                    for (int k = 1, l = k + l2 - 1; l <= len2; k++, l++)
                    {
                        if (!dp[i][j][k][l])
                        {
                            bool b1 = i <= j && a[i] == a[j] && dp[i + 1][j - 1][k][l];
                            bool b2 = k <= l && b[k] == b[l] && dp[i][j][k + 1][l - 1];
                            bool b3 = l > 0 && a[i] == b[l] && dp[i + 1][j][k][l - 1];
                            bool b4 = j > 0 && a[j] == b[k] && dp[i][j - 1][k + 1][l];
                            dp[i][j][k][l] = b1 || b2 || b3 || b4;
                        }
                        if (dp[i][j][k][l])
                            ans = max(ans, l1 + l2);
                    }
        printf("%d\n", ans);
    }
    return 0;
}
全部评论

相关推荐

牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
Rena1ssanc...:对的,要是面评没太烂,勤更新简历等捞就行了,腾讯可以无限复活
点赞 评论 收藏
分享
07-02 10:44
门头沟学院 C++
码农索隆:太实诚了,告诉hr,你能实习至少6个月
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务