L2-008. 最长对称子串
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:Is PAT&TAP symmetric?输出样例:
11
题解:
这一题我最开始的想法是想到了最长公共子序列,而这个是字串。根据寒假集训所得的区间DP的思想,我进行了修改,就是dp[i][j] = dp[i+1][j-1]+2,一开始没有拿到满分,经过分析后(枚举样例)我成功发现了自己的问题所在。就是这个递推式的成立是建立在dp[i+1][j-1]也是满足str[i+1] == str[j-1]的情况下才行。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char str[1009];
int dp[1009][1009];
int main()
{
ios::sync_with_stdio(false);
gets(str);
int slen = strlen(str);
for (int i = 0;i <= 1008;i ++)dp[i][i] = 1;
for (int len = 1;len < slen;len ++){
for (int i = 0,j = len+i;j < slen;i ++){
j = len + i;
if (str[i] == str[j]){
if (len > 2){
if (dp[i+1][j-1])
dp[i][j] = dp[i+1][j-1]+2;
else dp[i][j] = 0;
}
else
dp[i][j] = dp[i+1][j-1]+2;
}
}
}
int maxn = 0;
for (int i = 0;i < slen;i ++){
for (int j = 0;j < slen;j ++){
// if (j < i){
// cout << " \t";
// continue;
// }
// cout << i << ' ' << j << ' ' << dp[i][j] << '\t';
maxn = max(dp[i][j],maxn);
}
// cout << endl;
}
cout << maxn << endl;
}
// 11111 11111 11121 11111 111
// 11 2
// 112 111