天梯赛 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. 输入格式: 输入在一 ...
随机推荐
- 40、mysql数据库(触发器)
1.触发器说明: 使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为,注意:没有查询. 2.创建触发器语法: (1)插入前: CREATE TRIGGER tri_before_insert ...
- 浅析WebSocket 原理
浅析WebSocket 原理 长恨此身非我有,何时忘却营营. 简介:先简单了解下WebSocket 原理,日后的使用中再进一步深入研究~ 一.什么是WebSocket WebSocket 是HTML5 ...
- 资源:mysql下载路径
mysql的下载路劲 https://dev.mysql.com/downloads/mysql/
- 确保 PHP 应用程序的安全 -- 不能违反的四条安全规则(转)
规则 1:绝不要信任外部数据或输入 关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据.外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数 ...
- ESP32智能配网笔记
基于ESP-IDF4.1 #include <string.h> #include <stdlib.h> #include "freertos/FreeRTOS.h& ...
- QT. 学习之路 一
初识QT 一: hello-world: #include "mainwindow.h" #include <QApplication> #include < ...
- 「AGC021E」Ball Eat Chameleons
「AGC021E」Ball Eat Chameleons 考虑如何判定一个合法的颜色序列. 不妨设颜色序列中有 \(R\) 个红球,\(B\) 个蓝球,所以有 \(R+B=k\). 考虑分情况讨论: ...
- 个人博客开发之blog-api 项目全局日志拦截记录
前言 大型完善项目中肯定是需要一个全局日志拦截,记录每次接口访问相关信息,包括: 访问ip,访问设备,请求参数,响应结果,响应时间,开始请求时间,访问接口描述,访问的用户,接口地址,请求类型,便于项目 ...
- [刘阳Java]_步步窥探JS变量作用域
今天的这个文章题目名称甚是让人会突发异想.JS变量作用域是务必需要搞懂的,单从面试过程就会让面试者烧脑壳.所以,我们还是写一篇关于JS变量作用域的技术专题,让所有小伙伴能够借此文章去整理JS的基础学习 ...
- CF1329F题解
能发现: 1.输出序列与掉落顺序没有任何关系(因为单调性不会被改变). 2.输出的序列 \(h_i\) 最多有一组 \(h_i=h_{i+1}\). 对 2 的证明: 当 \(h_{i+1}\) 与 ...