天梯赛 L2-008 最长对称子串
题目是PTA的天梯赛练习集中的L2-008
https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376
其实一开始写这个题之前我对于DP是这么认为的
a. DP本质上就是按照一定的顺序来填表。
b. DP填表的顺序是什么呢?按照分而治之的思路来填表,也就是说将完整的问题分解成其子问题,不断地从解决那个最优子问题的一个最优子结构推到一个更大的最优的子结构,直到最后整个完整的问题的最优结构被推出来。
所以我最开始是有一个自己的想法的,但是后面证实这个自己的想法行不通,原因就是我以为的最优子结构它并不是最优子结构。
然后找了一下题解,学完题解之后谈下我的理解。
对于这个问题。
- 如果一个子串的长度是1,那么它也算是一个回文子串,长度也就是1。
- 如果这个子串的长度是2,并且两个字符相同,那么它肯定是一个回文子串,长度为2。
- 如果这个子串的长度大于2,那么因为我们用 i 和 j 来标识了它的起始位置和结束位置,那么如果a【i】和a【j】不一样,那么它就肯定不是一个回文串啦,但是如果a【i】和a【j】相等,那么它是否为一个回文子串取决于从a【i+1】到a【j-1】这个子串是否回文子串了。
上面的第三点就是我们说的,要解决这个问题,需要取决于其子结构来确定其解
但是在上述的填表过程中,填表必须按照一个正确的顺序,可能某个dp【】【】需要在另外一个dp【】【】先被填后,才能够填充。
那么,顺序应该是什么样的呢?
首先我们用的是dp【i】【j】来表示从第i个到第j个字符的子串是否回文串,那么i肯定是要小于等于j的,所以我们在dp这个二维数组中,只有对角线以及右上角半个二维数组需要填。
其次,因为我们的递推式中,要填 a【i】【j】必须先有a【i-1】【j+1】,放到二维数组中呢,其实就是某个格子左下角的格子。
所以一个格子要被填充之前,它的左下角的格子必须先被填充。
我们在遍历填表的时候,因为是两个for循环嵌套,那么肯定是外层循环是行,内层循环是列或者是外层循环是列,内层循环是行这两种顺序,我们为了保证某个格子左下角的格子已经被填,那么最好就是用外层循环是列,内层循环是行这样来操作。
那么dp肯定需要初始化啦,上面的第一点和第二点就是来做初始化的。长度为1的子串是回文子串,那么二维数组中的对角线需要预先填好,并且,对于所有dp【i】【j】(j = i+1)的格子,也就是长度为2的回文子串,也可以直接填好。
初始化了之后,所有的格子在填写的时候都有了依据,就能完成这个dp啦。
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1050;
string s;
int dp[maxn][maxn],ans = 0;
int main(){
#ifndef ONLINE_JUDGE
//freopen("in.txt","r",stdin);
#endif
getline(cin,s);
int len = s.length();
memset(dp,0,sizeof(dp));
for(int i=0;i<len;i++)
dp[i][i] = 1;
for(int j=0;j<len;j++){
for(int i=0;i<=j;i++){
if(s[i] == s[j] && j == i+1) dp[i][j] = 1;
else if(s[i] == s[j] && dp[i+1][j-1]) dp[i][j] = 1;
int newlen = j-i+1;
if(dp[i][j] && ans < newlen) ans = newlen;
}
}
cout<<ans<<endl;
return 0;
}
天梯赛 L2-008 最长对称子串的更多相关文章
- 团体程序设计天梯赛-练习集L2-008. 最长对称子串
L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...
- 天梯赛L2-008 最长对称子串 (字符串处理)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...
- 天梯杯 L2-008. 最长对称子串
L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...
- c语言:最长对称子串(3种解决方案)
问题描述: 输入一个字符串,输出该字符串中最大对称子串的长度.例如输入字符串:“avvbeeb”,该字符串中最长的子字符串是“beeb”,长度为4,因而输出为4. 解决方法:中序遍历 一,全遍历的方法 ...
- L2-008 最长对称子串 (25 分) (模拟)
链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376 题目: 对给定的字符串,本题要求你输出 ...
- L2-008. 最长对称子串(思维题)*
L2-008. 最长对称子串 参考博客 #include <iostream> using namespace std; int main() { string s; getline(ci ...
- pat 团体赛练习题集 L2-008. 最长对称子串
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...
- L2-008. 最长对称子串
L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...
- L2-008 最长对称子串 (25 分)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
- PAT L2-008 最长对称子串(模拟字符串)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
随机推荐
- API安全综述
API安全综述 译自:An Overview on API Security. 本文概括了API防护有关的方方面面,从上层视角介绍了API防护中主要注意的点,并给出了相应的建议.本文可以作为一个API ...
- 使用gitlab自带的ci/cd实现.net core应用程序的部署
这两天在折腾持续集成和交付,公司考虑使用gitlab自带的ci/cd来处理,特此记下来整个流程步骤. 好记性不如一支烂笔头---尼古拉斯-古人言 第一步: 安装gitlab,这个自然不用多说 第二步: ...
- POJ 2506 Tiling dp+大数 水题
大致题意:现有两种方块(1X2,2X2),方块数量无限制.问用这两种方块填满2Xn的矩阵的填法有多少种. 分析:通俗点说,找规律.专业化一点,动态规划. 状态d[i],表示宽度为i的填法个数. 状态转 ...
- Docker搭建Gogs代码仓库——代码自动化运维部署平台(一)
一.准备工作 1.Gogs 概念: Gogs 是一款极易搭建的自助 Git 服务. 目的: Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Go ...
- centos Gitlab AD 集成
简述 Gitlab支持集成LDAP用户认证系统.兼容包括Microsoft Active Directory, Apple Open Directory, Open LDAP, 与389 Server ...
- RabbitMq脑裂问题
现象 部署在阿里云上的2台RabbitMQ主从,访问management页面时出现如下所示的内容: 查看其中一个mq的日志,发现如下内容: 00:06:32.423 [warning] <0.5 ...
- linux--------find命令之xargs
p.p1 { margin: 0; font: 18px "Hannotate SC"; color: rgba(4, 51, 255, 1); -webkit-text-stro ...
- JUnit5参数化测试的几种方式
参数化测试一直是津津乐道的话题,我们都知道JMeter有四种参数化方式:用户自定义变量.用户参数.CSV文件.函数助手,那么JUnit5有哪些参数化测试的方式呢? 依赖 JUnit5需要添加junit ...
- 开发必备linux命令大全-稳赚不亏
我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须.接下来将一一详细介绍一些常用的linux的命令 文件操作 远程登录与操作 磁盘挂载 进程管理 启动和结束 系统性能参数查看 ...
- 前端-Vue基础3(父子组件交互)
1.子组件往父组件传值 点击子组件的值,子组件自增,父组件的值也跟着自增 通过:this.$emit('change')方法向父组件暴露事件,在子组件中引用,可以调用父组件的方法 点击子组件触发cli ...