【每日一题】2.合并回文子串 (字符串处理 + 区间DP)
题目链接:Here
遇到这种数据范围较小的计数问题应该优先考虑dp,本题就是如此。
那么应该怎么样考虑转移呢?
首先最后C中的那个价值最大的子串一定是由字符串A的一个区间和字符串B的一个区间合并得到的,
那么现在假设 A[i] ~ A[j]与 B[k] ~ B[l] 构成了一个回文串(这里设 dp[i][j][k][l])
则他能转移到的区间有
1:\(a[i-1]==a[j+1] 时\ dp[i-1][j+1][k][l]\)
2:\(a[i-1]==b[l+1]时\ dp[i-1][j][k][l+1]\)
3:\(b[k-1]==a[j+1]时\ dp[i][j+1][k-1][l]\)
4:\(b[k-1]==b[l+1]时\ dp[i][j][k-1][l+1]\)
那么对于的转移方程也就是:
if (a[i] == a[j]) dp[i][j][k][l] |= dp[i + 1][j - 1][k][l];
if (b[k] == b[l]) dp[i][j][k][l] |= dp[i][j][k + 1][l - 1];
if (a[i] == b[l]) dp[i][j][k][l] |= dp[i + 1][j][k][l - 1];
if (a[j] == b[k]) dp[i][j][k][l] |= dp[i][j - 1][k + 1][l];
然后就可以轻松的区间转移啦~~~~~
oh,在注意一下枚举过程中只有一个字母的状态一定是回文的就可以啦
AC 代码
// Murabito-B 21/04/06
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int dp[60][60][60][60];
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int _;
for (cin >> _; _--;) {
string a, b;
cin >> a >> b;
a = "@" + a, b = "@" + b;
int lena = a.size(), lenb = b.size();
int ans = 0;
for (int l1 = 0; l1 <= lena; ++l1)
for (int l2 = 0; l2 <= lenb; ++l2)
for (int i = 1; i <= lena - l1; ++i)
for (int k = 1; k <= lenb - l2; ++k) {
int j = i + l1 - 1, l = k + l2 - 1;
// 说明此时仅一个点
if (l1 + l2 <= 1) dp[i][j][k][l] = 1;
else {
dp[i][j][k][l] = 0;
if (a[i] == a[j]) dp[i][j][k][l] |= dp[i + 1][j - 1][k][l];
if (b[k] == b[l]) dp[i][j][k][l] |= dp[i][j][k + 1][l - 1];
if (a[i] == b[l]) dp[i][j][k][l] |= dp[i + 1][j][k][l - 1];
if (a[j] == b[k]) dp[i][j][k][l] |= dp[i][j - 1][k + 1][l];
}
if (dp[i][j][k][l]) ans = max(ans, l1 + l2);
}
cout << ans << "\n";
}
return 0;
}
【每日一题】2.合并回文子串 (字符串处理 + 区间DP)的更多相关文章
- 合并回文子串(区间dp)
链接:https://ac.nowcoder.com/acm/problem/13230来源:牛客网 题目描述 输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如" ...
- nowcoder 合并回文子串
链接:https://www.nowcoder.com/acm/contest/6/C来源:牛客网题目输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如"abc&q ...
- 最长回文子串(Longest Palindromic Substring)-DP问题
问题描述: 给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 . 思路分析: 动态规划的思路:dp[i][j] 表示的是 从i 到 j 的字串 ...
- 美团2017年CodeM大赛-初赛A轮 C合并回文子串
区间dp一直写的是递归版本的, 竟然超时了, 学了一下非递归的写法. #include <iostream> #include <sstream> #include <a ...
- 求最长回文子串 - leetcode 5. Longest Palindromic Substring
写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...
- leetcode-5 最长回文子串(动态规划)
题目要求: * 给定字符串,求解最长回文子串 * 字符串最长为1000 * 存在独一无二的最长回文字符串 求解思路: * 回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文 ...
- 【LeetCode每日一题 Day 5】5. 最长回文子串
大家好,我是编程熊,今天是LeetCode每日一题的第五天,一起学习LeetCode第五题<最长回文子串>. 题意 给你一个字符串 s,找到 s 中最长的回文子串. 示例 输入:s = & ...
- 【每日一题】【奇偶分别中心扩展/动态规划】2022年2月5日-NC最长回文子串的长度
描述对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度. 方法1:奇数偶数分别从中心扩展 import java.util.*; public c ...
- 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297
1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...
- 每日一道 LeetCode (48):最长回文子串
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
随机推荐
- OpenSSL 使用AES对文件加解密
AES(Advanced Encryption Standard)是一种对称加密算法,它是目前广泛使用的加密算法之一.AES算法是由美国国家标准与技术研究院(NIST)于2001年发布的,它取代了原先 ...
- MINA框架
一.小程序MINA框架分为三个部分: 有 View(视图层).App Service(逻辑层)和 Natice(系统层). 1.View(视图层) 视图层包含了小程序多个页面.每个页面都有WXML文件 ...
- 神经网络优化篇:详解训练,验证,测试集(Train / Dev / Test sets)
训练,验证,测试集 在配置训练.验证和测试数据集的过程中做出正确决策会在很大程度上帮助大家创建高效的神经网络.训练神经网络时,需要做出很多决策,例如: 神经网络分多少层 每层含有多少个隐藏单元 学习速 ...
- 在 Sealos 中使用区块链技术实现统一支付系统
拿着区块链技术不一定是去发币,很多业务系统也适合用这些技术,比如做个统一支付系统,积分系统等,可以做为一家公司的金融基础设施,或支付中台.拿链的技术去做有很多好处: 高可用,自带多区域高一致性的能力, ...
- erp——绩效考核系统——数据需求说明书
绩效考核--数据需求说明书 1.引言 1.1编写目的 数据要求说明书详细的提供了系统中各个数据的流向,是设计数据库的关键所在,为以后的编码以及测试提供一份可靠的依据. 1.2 对象 本<数据要求 ...
- springBoot——整合mybatis
spring整合mybatis springBoot整合mybaits 配置文件 spring: datasource: url: jdbc:mysql://localhost:3306/test d ...
- NC65元数据添加七彩版时注意点
元数据添加七彩版时注意点 元数据七彩版模式 --- 主要添加Xml文件调整格式 添加时注意点如下 手动创建Panel时 自动生成的实现方法中有一个方法的返回值一定要为true 该方法主要是控制显不显示 ...
- [python] 基于Dataset库操作数据库
dataset库是Python中一个用于操作数据库的简单库,它提供了一种简洁的方式与各种关系型数据库进行交互,例如SQLite.MySQL.PostgreSQL 等.你可以使用dataset库来执行查 ...
- Android移动、缩放和旋转手势实现
Android的部分图片编辑应用中需要对图片进行移动.缩放和旋转,这些变化都依赖于触摸手势实现,而本文主要阐述移动.缩放和旋转手势的简单实现. 一.移动 首先需要从触摸事件(MotionEvent)中 ...
- 前世今生:Kubernete 是如何火起来的?
本课时,我们就开始正式进入 Kubernetes 的学习,或许你已经听过或简单了解过 Kubernetes,它是一款由 Google 开源的容器编排管理工具,而我们想要深入地掌握 Kubernetes ...