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), ...
随机推荐
- python学习笔记2(pycharm、数据类型)
Pycharm 的使用 IDE(Integrated Development Environ ment) :集成开发环境 Vim :经典的linux下的文本编辑器(菜鸟和大神喜欢使用) Emac ...
- seajs学习笔记
seajs配置 seajs.config({ //别名配置 alias:{ 'es5-safe':'gallery/es5-safe/0.9.3/es5-safe', 'jquery':'jquery ...
- js 中{},[]中括号,大括号
1. { } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 如: var LangShen = {"Name":"Langshen",& ...
- Atitit.HTTP 代理原理及实现 正向代理与反向代理attilax总结
Atitit.HTTP 代理原理及实现 正向代理与反向代理attilax总结 1. 普通代理1 1.1.1. 普通代理2 2. 隧道代理3 3. 反向代理 4 4. 正向代理也可以使用apache实现 ...
- 使用tinypng优化Android的资源图片
tinypng 是一个支持压缩png和jpg图片格式的网站,通过其独特的算法(通过一种叫“量化”的技术,把原本png文件的24位真彩色压缩为8位的索引演示,是一 种矢量压缩方法,把颜色值用数值123等 ...
- 转 asp.net中如何退出整个框架(frameset),回到登录界面
如: <frameset rows= "74,*,0,0 " cols= "* " frameborder= "NO " border ...
- Android WelcomeActivity 启动画更换网络图片
1.运行效果 第一张是本地的启动图,第二张是网络启动图 2.用到的第三方jar包 Android-Universal-Image-Loader-master 不熟的请看 Andro ...
- 【转】android shape的使用
shape用于设定形状,可以在selector,layout等里面使用,有6个子标签,各属性如下: <?xml version="1.0" encoding="ut ...
- Android 开发组件
每一个应用程序都有自己独立的运行沙盒(授予应用程序代码的访问权) Android操作系统是一个多用户的Linux系统,其中的每一个应用程序都是一个独立的用户. 系统会为每一个应用程序分配一个唯一的Li ...
- C++非类型模板参数
对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数.在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定.但是在这里,我们面对的是这 ...