1 条题解
-
0
分析:
本题可用这是一种结合了递归和动态规划思想的算法,通过记录已经计算过的子问题的结果,避免重复计算,从而提高算法效率。
解题思路
本题的目标是判断输入的字符串是否为 “Slurpy” 串。“Slurpy” 串的定义是由一个 “Slimp” 串和一个 “Slump” 串拼接而成。解题的核心思路是分别设计判断 “Slump” 串和 “Slimp” 串的函数,利用记忆化搜索的方法避免重复计算,然后遍历字符串的所有可能分割点,检查分割后的两部分是否分别为 “Slimp” 串和 “Slump” 串。
解题原理
1.记忆化搜索:使用二维数组 slump 和 slimp 来记录已经判断过的子串是否为 “Slump” 串或 “Slimp” 串。在判断子串时,首先检查数组中是否已经有记录,如果有则直接返回结果,避免重复计算。
2.递归判断:
1.判断 “Slump” 串:“Slump” 串以 D 或 E 开头,后面跟着至少一个 F,最后以 G 结尾,或者后面跟着另一个 “Slump” 串。通过递归调用 isSlump 函数来判断子串是否符合 “Slump” 串的定义。
2.判断 “Slimp” 串:“Slimp” 串以 A 开头,以 H 结尾(长度为 2 时),或者以 A 开头,中间是 B 加另一个 “Slimp” 串,或者以 A 开头,后面跟着一个 “Slump” 串,最后以 C 结尾。通过递归调用 isSlimp 函数来判断子串是否符合 “Slimp” 串的定义。
3.判断 “Slurpy” 串:遍历字符串的所有可能分割点,检查分割后的前半部分是否为 “Slimp” 串,后半部分是否为 “Slump” 串,如果满足条件则该字符串为 “Slurpy” 串。
实现步骤
1.输入处理:读取测试用例的数量 n,对于每个测试用例,读取输入的字符串,并初始化 slump 和 slimp 数组为 -1,表示未计算。
2.判断 “Slump” 串:实现 isSlump 函数,使用记忆化搜索和递归的方法判断子串是否为 “Slump” 串。
3.判断 “Slimp” 串:实现 isSlimp 函数,使用记忆化搜索和递归的方法判断子串是否为 “Slimp” 串。
4.判断 “Slurpy” 串:在 main 函数中,遍历字符串的所有可能分割点,调用 isSlimp 和 isSlump 函数判断分割后的两部分是否分别为 “Slimp” 串和 “Slump” 串,如果满足条件则该字符串为 “Slurpy” 串。
5.输出结果:根据判断结果输出 “YES” 或 “NO”,最后输出 “END OF OUTPUT”。
c++代码:
#include <stdio.h> #include <iostream> #include <cstdlib> #include <cstring> using namespace std; int slump[65][65], slimp[65][65]; int l; char s[65]; void init(){ scanf("%s", s); l = strlen(s); for(int i = 0; i <= l; i++){ for(int j = i; j <= l; j++){ slump[i][j] = -1; slimp[i][j] = -1; } } } bool isSlump(int kt, int jw){ if(slump[kt][jw] != -1) return slump[kt][jw]; int res; if(jw-kt<2 || (s[kt] != 'D' && s[kt] != 'E')) res = 0; else{ int k = kt+1; while(k <= jw){ if(s[k] != 'F') break; k++; } if(k == jw+1 || k == kt+1) res = 0; else if(k == jw){ res = (s[k]=='G'); } else{ res = isSlump(k, jw); } } slump[kt][jw] = res; return res; } bool isSlimp(int kt, int jw){ if(slimp[kt][jw] != -1) return slimp[kt][jw]; int res; if(jw<=kt || s[kt]!='A') res = 0; else if(jw==kt+1){ res = (s[jw]=='H'); } else if(s[jw]!='C'){ res = 0; } else{ res = (s[kt+1]=='B' && kt+2<=jw-1 && isSlimp(kt+2,jw-1)) || (isSlump(kt+1,jw-1)); } slimp[kt][jw] = res; return res; } int main(){ int n; cout << "SLURPYS OUTPUT" << endl; scanf("%d",&n); while(n--){ init(); bool isSlurpy = 0; for(int i = 1; i < l-1; i++){ if(isSlimp(0, i) && isSlump(i+1, l-1)){ isSlurpy = 1; break; } } cout << (isSlurpy? "YES": "NO") << endl; } cout << "END OF OUTPUT" << endl; return 0; }
- 1
信息
- ID
- 531
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 1
- 上传者