天梯赛 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. 输入格式: 输入在一 ...
随机推荐
- MyBatis框架的使用解析!数据库相关API的基本介绍
动态SQL if 根据条件包含where子句的一部分 <select id="findActiveBlogLike" resultType="Blog"& ...
- MySQL索引类型总结和使用技巧以及注意事项 (转)
在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable表: 代码如下: CREATE TABLE mytable( ID INT NOT NULL, us ...
- Swoole实现毫秒级定时任务
项目开发中,如果有定时任务的业务要求,我们会使用linux的crontab来解决,但是它的最小粒度是分钟级别,如果要求粒度是秒级别的,甚至毫秒级别的,crontab就无法满足,值得庆幸的是swoole ...
- CG-CTF single
一.拖入ida,先静态分析一下 发现有三个函数,点击进去看看 a1为0时,当a2[i]为0时,将自身的值赋值到该位置,a1为0时,就不需要动. 这三个函数都是在暗示这东西是个数独,每行每列,都有1到9 ...
- ASP.NET保存图片到sql2008
//将图片转行为二进制的方式,存储到数据库 string name = FileUpload1.PostedFile.FileName; string type = name.Substring(na ...
- Windows内核驱动--实现修改线程优先级demo
在User下修改优先级比较麻烦,该驱动可以直接用线程ID,和优先级级数两个参数直接修改线程的优先级: Client代码: #include <Windows.h> #include < ...
- 8Java设计模式(持续更新)
1.单例模式(Singleton pattern): 单例模式的实现方式是,一个类能返回对象的一个引用(永远是同一个)和一个获得该唯一实例的方法(必须是静态方法). 饿汉式: public class ...
- R Studio Server install fails - hard coded libssl1.0.0 dependency out of date ...
wget http://ftp.debian.org/debian/pool/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u6_amd64.deb md5sum l ...
- 开源百宝箱《HelloGitHub》第 64 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. HelloGitHub 有实战.教程.黑科技.开源书籍.企业级开源项目,涵盖多种编程 ...
- pytest框架
1.添加日志 import logging logging.debug('This is debug message') logging.info('This is info message') lo ...