天梯赛 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. 输入格式: 输入在一 ...
随机推荐
- C# datagridview 这是滚动条位置
1.datagridview 设置 表格内容铺满,内容自动换行 dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True; ...
- 由ASP.NET Core WebApi添加Swagger报错引发的探究
缘起 在使用ASP.NET Core进行WebApi项目开发的时候,相信很多人都会使用Swagger作为接口文档呈现工具.相信大家也用过或者了解过Swagger,这里咱们就不过多的介绍了.本篇文章记录 ...
- csu-acm 1503: 点到圆弧的距离
1503: 点到圆弧的距离 分析: 先判断点和圆心的连线是否在圆弧范围内,如果在,最短距离即到圆心的距离减去半径的绝对值:反之,为到端点的最短距离. 具体看注释 #include <bits/s ...
- css角标
HTML: <div class='card-wrap'> <div class='news1'> <div class='ribbon'> <div cla ...
- Nginx:Nginx日志切割方法
Nginx的日志文件是没有切割(rotate)功能的,但是我们可以写一个脚本来自动切割日志文件. 首先我们要注意两点: 1.切割的日志文件是不重名的,所以需要我们自定义名称,一般就是时间日期做文件名. ...
- 基于redis的分布式锁防止高并发重复请求
需求: 我们先举个某系统验证的列子:(A渠道系统,业务B系统,外部厂商C系统)(1)B业务系统调用A渠道系统,验证传入的手机.身份证.姓名三要素是否一致.(2)A渠道系统再调用外部厂商C系统.(3)A ...
- 获取操作系统OS等相关信息
问题一:Windows SDK 8.1版本中的VersionHelper.h文件当中没有IsWindows10ORGreater,所以当你用IsWindows8Point1ORGreater判断出版本 ...
- C语言:常用数学函数
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> # ...
- c语言:输出汉字编码
#include<stdio.h> main() { //char a[5]; //strcpy(a,"啊"); char a[5]="职"; pr ...
- C语言:外部函数
//main.c #include <stdio.h> extern void func(); extern int m; int n = 200; int main(){ func(); ...