UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
题意:给一个元素周期表的元素符号(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)的更多相关文章
- UVALive 6257 Chemist's vows
#include<iostream> #include<string.h> #include<stdio.h> #include<ctype.h> #i ...
- UVAlive 7414 Squeeze the Cylinders a,b,c三种步数 搜索+最短路
题意:给你n个点(n<=50),然后有些点之间会有一条路,路是单向的,每个回合让你走a,b,c三种步数中的任意一种(a,b,c<=100),问你最少需要多少个回合才能保证一定能从1点到达n ...
- UVALive 3486/zoj 2615 Cells(栈模拟dfs)
这道题在LA是挂掉了,不过还好,zoj上也有这道题. 题意:好大一颗树,询问父子关系..考虑最坏的情况,30w层,2000w个点,询问100w次,貌似连dfs一遍都会TLE. 安心啦,这肯定是一道正常 ...
- 【栈模拟dfs】Cells UVALive - 3486
题目链接:https://cn.vjudge.net/contest/209473#problem/D 题目大意:有一棵树,这棵树的前n个节点拥有子节点,告诉你n的大小,以及这n个节点各有的子节点个数 ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- UVALive - 6257 K - Chemist's vows 【DFS】【BFS】【DP】
题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- Central Europe Regional Contest 2012 Problem c: Chemist’s vows
字符串处理的题目: 学习了一下string类的一些用法: 这个代码花的时间很长,其实可以更加优化: 代码: #include<iostream> #include<string> ...
- [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 ...
- [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), ...
随机推荐
- JavaScript indexOf() 方法和 lastIndexOf() 方法
一,定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索 ...
- js验证真实姓名与身份证号,手机号
最近的项目中用的需要调用实名认证的接口,实名认证接口价格相比短信而言高了不是几分钱,所以说调用实名认证的条件就要严格把关,因此用到js验证真实姓名与js验证身份证号. 进入正题 1.js验证真实姓名 ...
- HTML 5 中的标准属性
HTML 全局属性 HTML 属性赋予元素意义和语境. 下面的全局属性可用于任何 HTML 元素. (5)= HTML5 中添加的属性. 属性 描述 accesskey 规定激活元素的快捷键. cla ...
- 2015年第3本(英文第2本):Daughter of Deceit
书名:Daughter of Deceit 作者: Victoria Holt (维多丽亚·荷特) 单词数:12万 词汇量:6000 首万词不重复词数:1700 蓝思值:570 阅读时间:1月12日- ...
- C语言指针的长度和类型
本文地址:http://www.cnblogs.com/archimedes/p/point-length-type.html,转载请注明源地址. 如果考虑应用程序的兼容性和可移植性,指针的长度就是一 ...
- 安卓第十三天笔记-服务(Service)
安卓第十三天笔记-服务(Service) Servcie服务 1.服务概念 服务 windows 服务没有界面,一直运行在后台, 运行在独立的一个进程里面 android 服务没有界面,一直运行在后台 ...
- OC中的复合
#import <Foundation/Foundation.h> #import "Car.h" int main(int argc, const char * ar ...
- Swift的7大误区
Swift正在完成一个惊人的壮举,它正在改变我们在苹果设备上编程的方式,引入了很多现代范例,例如:函数式编程和相比于OC这种纯面向对象语言更丰富的类型检查. Swift语言希望通过采用安全的编程模式去 ...
- Uva 110 - Meta-Loopless Sorts(!循环,回溯!)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- 这些git技能够你用一年了
用git有一年了,下面是我这一年来的git使用总结,覆盖了日常使用中绝大多数的场景.嗯,至少是够用一年了,整理出来分享给大家,不明白的地方可以回复交流. git设置关闭自动换行 git config ...