1 条题解

  • 0
    @ 2025-5-4 15:57:44

    分析:

    本题可用这是一种结合了递归和动态规划思想的算法,通过记录已经计算过的子问题的结果,避免重复计算,从而提高算法效率。

    解题思路

    本题的目标是判断输入的字符串是否为 “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
    上传者