题目是PTA的天梯赛练习集中的L2-008

https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376

其实一开始写这个题之前我对于DP是这么认为的

a. DP本质上就是按照一定的顺序来填表。

b. DP填表的顺序是什么呢?按照分而治之的思路来填表,也就是说将完整的问题分解成其子问题,不断地从解决那个最优子问题的一个最优子结构推到一个更大的最优的子结构,直到最后整个完整的问题的最优结构被推出来。

所以我最开始是有一个自己的想法的,但是后面证实这个自己的想法行不通,原因就是我以为的最优子结构它并不是最优子结构。

然后找了一下题解,学完题解之后谈下我的理解。

对于这个问题。

  1. 如果一个子串的长度是1,那么它也算是一个回文子串,长度也就是1。
  2. 如果这个子串的长度是2,并且两个字符相同,那么它肯定是一个回文子串,长度为2。
  3. 如果这个子串的长度大于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 最长对称子串的更多相关文章

  1. 团体程序设计天梯赛-练习集L2-008. 最长对称子串

    L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...

  2. 天梯赛L2-008 最长对称子串 (字符串处理)

    对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...

  3. 天梯杯 L2-008. 最长对称子串

    L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...

  4. c语言:最长对称子串(3种解决方案)

    问题描述: 输入一个字符串,输出该字符串中最大对称子串的长度.例如输入字符串:“avvbeeb”,该字符串中最长的子字符串是“beeb”,长度为4,因而输出为4. 解决方法:中序遍历 一,全遍历的方法 ...

  5. L2-008 最长对称子串 (25 分) (模拟)

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376 题目: 对给定的字符串,本题要求你输出 ...

  6. L2-008. 最长对称子串(思维题)*

    L2-008. 最长对称子串 参考博客 #include <iostream> using namespace std; int main() { string s; getline(ci ...

  7. pat 团体赛练习题集 L2-008. 最长对称子串

    对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...

  8. L2-008. 最长对称子串

    L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...

  9. L2-008 最长对称子串 (25 分)

    对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...

  10. PAT L2-008 最长对称子串(模拟字符串)

    对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...

随机推荐

  1. MySQL数据库复制技术应用实战(阶段二)

    MySQL数据库复制技术应用实战(阶段二)文档 作者 刘畅 时间 2020-9-27 服务器版本:CentOS Linux release 7.5.1804 主机名 ip地址 服务器配置 安装软件 密 ...

  2. 1.5Java、万维网以及其他

    要点提示:Java是一种功能强大和多用途的编程语言,可用于开发运行在移动设备.台式计算机以及服务器端的软件.

  3. Docker:docker部署Tomcat运行web项目

    查找Docker Hub上的tomcat镜像 docker search tomcat 拉取官方的镜像 docker pull tomcat 启动Tomcat服务 方式1: 通过dockerfile生 ...

  4. pdm文件name与comment互相同步

    1.使用Powerdesigner工具将pdm文件的name同步至comment. 点击Tools->Execute Commands->Edit/Run Scripts 输入脚本: Op ...

  5. 如何查看wsdl文档

    http://www.360doc.com/content/16/1027/00/37651083_601648996.shtml

  6. 使用 redis 减少 秒杀库存 超卖思路 (转)

      由于数据库查询的及插入的操作 耗费的实际时间要耗费比redis 要多, 导致 多人查询时库存有,但是实际插入数据库时却超卖 redis 会有效的减少相关的延时,对于并发量相对较少的 可以一用 1 ...

  7. python字典和列表使用

    一.字典中健值为列表或字典 1 a.setdefault(key,[]).append(b)--键值是列表 2 a.setdefault(key,{}).append(b)--键值是字典 二.键值为列 ...

  8. [Vue入门及介绍,基础使用、MVVM架构、插值表达式、文本指令、事件指令]

    [Vue入门及介绍,基础使用.MVVM架构.插值表达式.文本指令.事件指令] 1)定义:javascript渐进式框架 ​ 渐进式:可以控制一个页面的一个标签,也可以控制一系列标签,也可以控制整个页面 ...

  9. 《Do Neural Dialog Systems Use the Conversation History Effectively? An Empirical Study》

    https://zhuanlan.zhihu.com/p/73723782 请复制粘贴到markdown 查看器查看! Do Neural Dialog Systems Use the Convers ...

  10. python log装饰器

    def log(func): #将原函数对象的指定属性复制给包装函数对象, 默认有 module.name.doc,或者通过参数选择 @functools.wraps(func) def wrappe ...