题意:给一个元素周期表的元素符号(114种),再给一个串,问这个串能否有这些元素符号组成(全为小写)。

解法1:动态规划

定义:dp[i]表示到 i 这个字符为止,能否有元素周期表里的符号构成。

则有转移方程:dp[i] = (dp[i-1]&&f(i-1,1)) || (dp[i-2]&&f(i-2,2))     f(i,k):表示从i开始填入k个字符,这k个字符在不在元素周期表中。  dp[0] = 1

代码:

//109ms 0KB
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
#define N 50007 string single[] = {"h","b","c","n","o","f","k","p","s","y","i","w","u","v"};
string ss[] = {"he","li","be","ne","na","mg",
"al","si","cl","ar","ca","sc","ti","cr","mn",
"fe","co","ni","cu","zn","ga","ge","as","se",
"br","kr","rb","sr","zr","nb","mo","tc","ru",
"rh","pd","ag","cd","in","sn","sb","te","xe",
"cs","ba","hf","ta","re","os","ir","pt","au",
"hg","tl","pb","bi","po","at","rn","fr","ra",
"rf","db","sg","bh","hs","mt","ds","rg","cn",
"fl","lv","la","ce","pr","nd","pm","sm","eu",
"gd","tb","dy","ho","er","tm","yb","lu","ac",
"th","pa","np","pu","am","cm","bk","cf","es",
"fm","md","no","lr"}; int vis[][],tag[];
int dp[N];
char st[N]; void init()
{
memset(vis,,sizeof(vis));
memset(tag,,sizeof(tag));
for(int i=;i<;i++)
tag[single[i][]-'a'] = ;
for(int i=;i<;i++)
vis[ss[i][]-'a'][ss[i][]-'a'] = ;
} int main()
{
int t,len,i;
init();
scanf("%d",&t);
while(t--)
{
scanf("%s",st+);
len = strlen(st+);
memset(dp,,sizeof(dp));
dp[] = ;
for(i=;i<len;i++)
{
if(dp[i])
{
if(tag[st[i+]-'a'])
dp[i+] = ;
dp[i+] |= vis[st[i+]-'a'][st[i+]-'a'];
}
}
if(dp[len])
puts("YES");
else
puts("NO");
}
return ;
}

解法2:DFS

搜索时循环的是元素周期表的符号个数。详见代码

代码: (306ms)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
#define N 50007 string ss[] = {"h","b","c","n","o","f","k","p","s","y","i","w","u","v","he","li","be","ne","na","mg",
"al","si","cl","ar","ca","sc","ti","cr","mn",
"fe","co","ni","cu","zn","ga","ge","as","se",
"br","kr","rb","sr","zr","nb","mo","tc","ru",
"rh","pd","ag","cd","in","sn","sb","te","xe",
"cs","ba","hf","ta","re","os","ir","pt","au",
"hg","tl","pb","bi","po","at","rn","fr","ra",
"rf","db","sg","bh","hs","mt","ds","rg","cn",
"fl","lv","la","ce","pr","nd","pm","sm","eu",
"gd","tb","dy","ho","er","tm","yb","lu","ac",
"th","pa","np","pu","am","cm","bk","cf","es",
"fm","md","no","lr"}; int vis[N];
int len[];
char st[N];
int Length;
bool Tag; void init()
{
int i;
for(i=;i<;i++)
len[i] = ;
for(i=;i<;i++)
len[i] = ;
} void dfs(int u)
{
if(u == Length)
Tag = ;
if(Tag)
return;
for(int i=;i<;i++)
{
int flag = ;
if(u+len[i] <= Length && !vis[u+len[i]])
{
for(int j=;j<len[i];j++)
{
if(ss[i][j] != st[u+j])
{
flag = ;
break;
}
}
if(flag)
{
vis[u+len[i]] = ;
dfs(u+len[i]);
}
}
}
} int main()
{
init();
int t,i;
scanf("%d",&t);
while(t--)
{
scanf("%s",st);
Length = strlen(st);
memset(vis,,sizeof(vis));
Tag = ;
dfs();
if(Tag)
puts("YES");
else
puts("NO");
}
return ;
}

解法3:乱搞,模拟。

分成: 单个元素存在与否,与前面匹不匹配,与后面匹不匹配,总共2^3 = 8种情况,然后O(n)扫过去,代码很长。。。

代码:(586ms)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
#define N 50007 string single[] = {"h","b","c","n","o","f","k","p","s","y","i","w","u","v"};
string ss[] = {"he","li","be","ne","na","mg",
"al","si","cl","ar","ca","sc","ti","cr","mn",
"fe","co","ni","cu","zn","ga","ge","as","se",
"br","kr","rb","sr","zr","nb","mo","tc","ru",
"rh","pd","ag","cd","in","sn","sb","te","xe",
"cs","ba","hf","ta","re","os","ir","pt","au",
"hg","tl","pb","bi","po","at","rn","fr","ra",
"rf","db","sg","bh","hs","mt","ds","rg","cn",
"fl","lv","la","ce","pr","nd","pm","sm","eu",
"gd","tb","dy","ho","er","tm","yb","lu","ac",
"th","pa","np","pu","am","cm","bk","cf","es",
"fm","md","no","lr"}; char st[N];
int vis[N]; int main()
{
int t,len,i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%s",st);
len = strlen(st);
int flag = ;
memset(vis,,sizeof(vis));
for(i=;i<len;i++)
{
if(vis[i])
continue;
string S = "";
S += st[i];
for(j=;j<;j++)
{
if(single[j] == S)
break;
}
if(j == ) //not single
{
if(i > && !vis[i-])
{
S = st[i-]+S;
for(j=;j<;j++)
{
if(ss[j] == S)
break;
}
if(j != ) //pre match
{
if(i < len-)
{
string ks = "";
ks += st[i];
ks += st[i+];
for(k=;k<;k++)
{
if(ss[k] == ks)
break;
}
if(k != ) //back match
vis[i] = ;
else //back not match
vis[i] = ;
}
}
else //pre not match
{
if(i < len-)
{
string ks = "";
ks += st[i];
ks += st[i+];
for(k=;k<;k++)
{
if(ss[k] == ks)
break;
}
if(k != ) //back match
vis[i+] = ;
else //back not match
{
flag = ;
break;
}
}
else
{
flag = ;
break;
}
}
}
else
{
if(i < len-)
{
string ks = "";
ks += st[i];
ks += st[i+];
for(k=;k<;k++)
{
if(ss[k] == ks)
break;
}
if(k != ) //back match
vis[i+] = ;
else //back not match
{
flag = ;
break;
}
}
else
{
flag = ;
break;
}
}
}
else //single
{
if(i > && !vis[i-])
{
S = st[i-]+S;
for(j=;j<;j++)
{
if(ss[j] == S)
break;
}
if(j != ) //pre match
{
if(i < len-)
{
string ks = "";
ks += st[i];
ks += st[i+];
for(k=;k<;k++)
{
if(ss[k] == ks)
break;
}
if(k != ) //back match
vis[i] = ;
else //back not match
vis[i] = ;
}
}
else //pre not match
{
if(i < len-)
{
string ks = "";
ks += st[i];
ks += st[i+];
for(k=;k<;k++)
{
if(ss[k] == ks)
break;
}
if(k != ) //back match
vis[i] = ;
else //back not match
vis[i] = ;
}
else
vis[i] = ;
}
}
else
{
if(i < len-)
{
string ks = "";
ks += st[i];
ks += st[i+];
for(k=;k<;k++)
{
if(ss[k] == ks)
break;
}
if(k != ) //back match
vis[i] = ;
else //back not match
vis[i] = ;
}
else
vis[i] = ;
}
}
}
if(flag)
puts("YES");
else
puts("NO");
}
return ;
}

UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)的更多相关文章

  1. UVALive 6257 Chemist's vows

    #include<iostream> #include<string.h> #include<stdio.h> #include<ctype.h> #i ...

  2. UVAlive 7414 Squeeze the Cylinders a,b,c三种步数 搜索+最短路

    题意:给你n个点(n<=50),然后有些点之间会有一条路,路是单向的,每个回合让你走a,b,c三种步数中的任意一种(a,b,c<=100),问你最少需要多少个回合才能保证一定能从1点到达n ...

  3. UVALive 3486/zoj 2615 Cells(栈模拟dfs)

    这道题在LA是挂掉了,不过还好,zoj上也有这道题. 题意:好大一颗树,询问父子关系..考虑最坏的情况,30w层,2000w个点,询问100w次,貌似连dfs一遍都会TLE. 安心啦,这肯定是一道正常 ...

  4. 【栈模拟dfs】Cells UVALive - 3486

    题目链接:https://cn.vjudge.net/contest/209473#problem/D 题目大意:有一棵树,这棵树的前n个节点拥有子节点,告诉你n的大小,以及这n个节点各有的子节点个数 ...

  5. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  6. UVALive - 6257 K - Chemist's vows 【DFS】【BFS】【DP】

    题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  7. Central Europe Regional Contest 2012 Problem c: Chemist’s vows

    字符串处理的题目: 学习了一下string类的一些用法: 这个代码花的时间很长,其实可以更加优化: 代码: #include<iostream> #include<string> ...

  8. [LeetCode] Find All Numbers Disappeared in an Array 找出数组中所有消失的数字

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

  9. [LeetCode] Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数

    Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...

随机推荐

  1. ahjesus js 快速求幂

    /* 快速幂计算,传统计算方式如果幂次是100就要循环100遍求值 快速幂计算只需要循环7次即可 求x的y次方 x^y可以做如下分解 把y转换为2进制,设第n位的值为i,计算第n位的权为x^(2^(n ...

  2. j2ee分布式缓存同步实现方案dlcache v1.0.0

    现成的分布式K/V缓存已经有很多的实现,最主要的比如redis,memcached,couchbase.那为什么我们还要自己去实现呢,在我们解决了分布式系统下大量rpc调用导致的高延时后,我们发现很多 ...

  3. 六个创建模式之单例模式(Singleton Pattern)

    定义: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.三个特点:一个类只有一个实例:必需自己创建这个实例:必需自行向整个系统提供这个实例. 结构图: Singleton:单例类,提 ...

  4. ElasticSearch文档-简单介绍

    ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进行数据索引 ...

  5. html与js的取值,赋值

    -------------------------------------------------- ------------------------------------------------- ...

  6. javascript --- 设计模式之单体模式(一)

    单体是一个用来划分命名空间并将一些相关的属性与方法组织在一起的对象,如果她可以被实例化的话,那她只能被实例化一次(她只能嫁一次,不能二婚). 单体模式是javascript里面最基本但也是最有用的模式 ...

  7. wxPython简单入门

    wxPython简介 wxPython 是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的.功能键全的  GUI 用户界面. wxPython 是作为优秀 ...

  8. ios NSURLSession(iOS7后,取代NSURLConnection)使用说明及后台工作流程分析

    NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的.在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作.注意, ...

  9. java获取时间戳的方法

    JAVA 获取当前月的初始时间的时间戳 public static long getMonthFirstDay() { Calendar calendar = Calendar.getInstance ...

  10. Http协议中 常用的参数应用

    1 请求来自哪一个页面 request.getHeader("referer"); 在购买页,通过a标签进入AddressAction中,地址保存后,需要跳到原先的页面. 另外,另 ...