(dfs)A -暴力模个拟(我是第一吗?我好像是第一个捏~)(原题目为Serval 的元素周期表)

简介: (dfs)A -暴力模个拟(我是第一吗?我好像是第一个捏~)(原题目为Serval 的元素周期表)

题目链接

清算时刻 - Virtual Judge (csgrandeur.cn)

Serval 的元素周期表 - Gym 103478B - Virtual Judge (csgrandeur.cn)

一些话

dfs积累的东西太少了,这种题特征很明显的,有积累的话纯粹是签到

因为这道题和A. Chat room(双指针)_栞那Kanna的博客-CSDN博客很像,都是问元素是否能组成字符串,所以我只能往双指针的方向想了,但是对于“CAL“这类的字符串,先”C“ 后 ”AL“ 还是 先 ”CA“得到的结果是完全不同的,用双指针的话很难写,所以平时多积累些套路才行。

流程

题目给了20个元素,问是否能组成输入的字符串,因为这些元素长短不一,且先后的顺序会对结果造成影响,所以直接把所有可能走一遍,对应的算法是dp和dfs,dp适合用于求最优解,此题没有最优解,所以用dfs

套路

题目有很多选择,可能性很多,且不存在最优解:


       用dfs(树状回溯)


       在每一步都试验所有的可能,当发现已经找到一种方式或者目前这种方式不可能是结果的时候,退回上一步继续尝试其他可能。很多时候每一步的处理都是一致的,这时候用递归来实现就很自然。


题目有很多选择,可能性很多,且存在最优解:


       dp

ac代码

#include <iostream>
using namespace std;
string f[30] = {"H","HE","LI","BE","B","C","N","O","F","NE", "NA","MG","AL","SI","P","S","CL","AR","K","CA"};
string s;
bool flag;
void dfs(int depth){
    if(depth == s.size()) {
        flag = true;
        return;
    }   
    if(depth != s.size()-1){
        string s1 = s.substr(depth,2);
        for(int j = 0;j < 20;j++){
            if(s1 == f[j]) {
                dfs(depth+2);
                break;
            }
        }
    }
        string s2 = s.substr(depth,1);
        for(int j = 0;j < 20;j++){
            if(s2 == f[j]) {
                dfs(depth+1);
                break;
            }
        }
}
int main(){
    cin >> s;
    dfs(0);
    if(flag) cout << "YES" << endl;
    else cout << "NO" << endl;
    return 0;
}
目录
相关文章
|
算法 索引
【算法挨揍日记】day09——35. 搜索插入位置、69. x 的平方根
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
87 0
|
6月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
7月前
【编程题-错题集】分割等和子集(动态规划 - 01背包)
【编程题-错题集】分割等和子集(动态规划 - 01背包)
|
7月前
|
人工智能
动态规划:小美的元素删除
动态规划:小美的元素删除
83 1
|
人工智能 算法
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
72 0
|
存储
LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字
LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字
73 0
|
算法
【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字
【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字
58 0
|
算法
【算法挨揍日记】day10——704. 二分查找、34. 在排序数组中查找元素的第一个和最后一个位置
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
364 0
|
算法 索引
【基础算法】浅浅刷个小题 # 搜索插入位置 # 各位相加 # 寻找数组的中心下标 #
【基础算法】浅浅刷个小题 # 搜索插入位置 # 各位相加 # 寻找数组的中心下标 #
|
算法 C++ Python
每日算法系列【LeetCode 658】找到 K 个最接近的元素
每日算法系列【LeetCode 658】找到 K 个最接近的元素