区间DP


思路:
区间DP
思路:
如果我们用f[i][j][k][l]表示前一个串(a串)的第 i 个字符到第 j 个字符后一个串(b串)的第 k 个字符到第 l 个字符能否组成一个回文串的话,有四种可能,四种当中任意一种为真f[i][j][k][l]就是真。
往 a[i+1] 到 a[j−1] 和 b[k] 到 b[l] 构成的串的两端加上 a[i] 和 a[j] 两个字符:
f[i][j][k][l] |= (f[i+1][j-1][k][l] & (a[i] == a[j]));
往 a[i+1] 到 a[j] 和 b[k] 到 b[l−1] 构成的串的两端加上 a[i] 和 b[l] 两个字符:
f[i][j][k][l] |= (f[i+1][j][k][l-1] & (a[i] == b[l]));
往 a[i] 到 a[j−1] 和 b[k+1] 到 b[l] 构成的串的两端加上 b[k] 和 a[j] 两个字符:
f[i][j][k][l] |= (f[i][j-1][k+1][l] & (b[k] == a[j]));
往 a[i] 到 a[j] 和 b[k+1] 到 b[l−1] 构成的串的两端加上 b[k] 和 b[l] 两个字符:
f[i][j][k][l] |= (f[i][j][k+1][l-1] & (b[k] == b[l]));
问题解决,其实我们可以看到,这个朴素的最长回文子串问题并没有实质上的区别,只是首尾两端加字母的选择从原来的一种变成了2*2种。
若是你没有写过区间dp的话,我提醒一点:区间dp要从短区间扩展到长区间,所以如果你不是使用记忆化搜索的话,就需要按区间长短来枚举而不是直接枚举首末端点!
一个小问题可能出现在边界上:alen+blen<=1时dp[][][][]肯定等于1,这时需要确定dp[][][][]的值肯定>=2,便可以由dp_len=0推出来。边界处理后就是正常的区间的dp啦!
转自:传送门

#pragma GCC optimize(3,"Ofast","inline")     //G++
#include<bits/stdc++.h>
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fcout cout<<setprecision(4)<<fixed
using namespace std;
typedef long long ll;
//======================================
namespace FastIO{char print_f[105];void read() {}void print() {putchar('\n');}
template <typename T, typename... T2>
inline void read(T &x, T2 &... oth){x = 0;char ch = getchar();ll f = 1;while (!isdigit(ch)){if (ch == '-')f *= -1;ch = getchar();}while (isdigit(ch)){x = x * 10 + ch - 48;ch = getchar();}x *= f;read(oth...);}
template <typename T, typename... T2>
inline void print(T x, T2... oth){ll p3=-1;if(x<0) putchar('-'),x=-x;do{print_f[++p3] = x%10 + 48;}while(x/=10);while(p3>=0) putchar(print_f[p3--]);putchar(' ');print(oth...);}} // namespace FastIO
using FastIO::print;
using FastIO::read;
//======================================
typedef pair<int,int> pii;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int maxn = 1e6+5;
int dp[55][55][55][55];
char a[105],b[105];
int main() {#ifndef ONLINE_JUDGEfreopen("H:\\code\\in.in", "r", stdin);freopen("H:\\code\\out.out", "w", stdout);clock_t c1 = clock();
#endif
//**************************************int T;read(T);while(T--){cin>>(a+1)>>(b+1);int n=strlen(a+1);int m=strlen(b+1);int ans=0;memset(dp,0,sizeof dp);for(int alen=0;alen<=n;alen++)for(int blen=0;blen<=m;blen++)for(int i=1;i+alen-1<=n;i++){int la=i,ra=i+alen-1;for(int j=1;j+blen-1<=m;j++){int lb=j,rb=j+blen-1;if(alen+blen<=1){dp[la][ra][lb][rb]=1;}else{dp[la][ra][lb][rb]|=dp[la+1][ra-1][lb][rb]&a[la]==a[ra];dp[la][ra][lb][rb]|=dp[la][ra][lb+1][rb-1]&b[lb]==b[rb];dp[la][ra][lb][rb]|=dp[la+1][ra][lb][rb-1]&a[la]==b[rb];dp[la][ra][lb][rb]|=dp[la][ra-1][lb+1][rb]&a[ra]==b[lb];}if(dp[la][ra][lb][rb]) ans=max(ans,alen+blen);}}print(ans);}
//**************************************#ifndef ONLINE_JUDGEcerr << "Time:" << clock() - c1 << "ms" << endl;
#endifreturn 0;
}

牛客竞赛-NC13230相关推荐

  1. 牛客竞赛:第三届超越杯程序设计团体赛题解

    比赛链接:第三届超越杯程序设计团体赛重现赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJhttps://www.nowcoder.com/acm/contest/313 ...

  2. 关于构造和二进制,题目:牛牛的DRB迷宫Ⅱ(源自牛客竞赛2020年寒假集训)

    关于构造和二进制,题目:牛牛的DRB迷宫Ⅱ(源自牛客竞赛2020年寒假集训) 题目: 链接:https://ac.nowcoder.com/acm/contest/3004/B 来源:牛客网 题目描述 ...

  3. 项链(牛客竞赛2020-普及组第四场-T4)

    项链(牛客竞赛2020-普及组第四场-T4) 题目 原题链接 样例 输入1 4 3 4 3 -2 1 1 2 2 3 3 4 输出1 7 1 说明1 第一组样例,最优路径为1→2→3→41 \to 2 ...

  4. 牛客竞赛数学专题班生成函数I 题解

    牛客竞赛数学专题班生成函数I 题解 题单链接 背包 题目链接 题意 总共有888个物品,对于每个物品的选法都有要求,问带nnn个物品的方案数. 思路 构造生成函数,并将等比级数转为合式(∏i=0xi= ...

  5. 牛客竞赛14346凌波微步题解

    牛客竞赛14346凌波微步题解 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 一.题目描述 小Z的体型 ...

  6. 牛客竞赛语法入门班数组栈、队列和stl习题

    牛客竞赛语法入门班数组栈.队列和stl习题 L 指纹锁 set ,自带排序功能 可重写排序函数 cmp,注意外边写的要写成 operator()operator()operator(),结构体内部的排 ...

  7. 牛客竞赛语法入门班顺序结构习题C++版本参考代码及部分解析

    牛客竞赛语法入门班顺序结构习题 C语言版本的参考代码 重点题: 1005 乘法表 1006 KiKi学程序设计基础 1017 水题再次来袭:明天星期几? 1018 开学? 1019 helloworl ...

  8. 【python】牛客竞赛语法入门班顺序结构习题 python解法

    题目链接:牛客竞赛语法入门班顺序结构习题_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 目录 1001 这是一道签到题 1002 排列式 1003 小飞机 1004 学 ...

  9. 5月10日、14日codeforce以及牛客竞赛总结

    这周稍微忙碌了一些,所以这周的竞赛总结就放在周天写了. codeforce上的比赛是div4的题目,比之前的都要简单一些,同时在做题的时候也发现了自己的很多不足.这次前两个题目是很简单的,可以直接AC ...

最新文章

  1. 常用快捷键整理,提升工作效率!
  2. matlab signal工具箱,免费试用Signal Processing Toolbox
  3. Cisco端口镜像配置
  4. JavaScript实现使用DisjointSet 检测无向循环算法(附完整源码)
  5. Cygwin 下载极速源推荐
  6. Screenium 3 for Mac - 强大的屏幕录制编辑器
  7. 485通信实现自动收发功能
  8. 使用Redis构建全局并发锁
  9. jmeter压力测试指标解释
  10. QQ输入法 for iPhone2.3
  11. 计算机考试怎样删除美式键盘,Win10怎么把美式键盘删除_Win10彻底删除eng美式键盘?-192路由网...
  12. type-C 边充电边听歌(OTG) PD芯片方案,LDR6028 PD充电加OTG方案
  13. 三阶齐次线性方程求通解_齐次线性方程组通解求法的数学原理
  14. python绘制四叶草_python绘图四叶草_Python教程,python,绘图
  15. 键盘定位板图纸_聊聊机械键盘的结构。
  16. 中国企业密钥管理(EKM)市场趋势报告、技术动态创新及市场预测
  17. def文件的作用及相关操作
  18. iOS SDWebImage缓存
  19. Dots Entity 删除
  20. Tik Tok直播:如何做好TikTok直播?

热门文章

  1. Mobox企业云存储的过去与未来
  2. matlab画阴影图
  3. 利用python找出连续三年业绩上涨30%的A股
  4. Python+Opencv实现简单PCA人脸识别
  5. bert 模型参数统计
  6. java sdk加密_rhizobia_J
  7. 【英语】40句英文句子,学会了会让你的阅读事半功倍
  8. Uncaught Error: only one instance of babel-polyfill is allowed
  9. H264 数据提取sps 和 pps 信息
  10. Linux进程3:父进程等待(wait,waitpid)子进程退出并收集子进程退出状态,僵尸进程