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), ...
随机推荐
- 欧拉计划之题目9:找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c}
本题来自:http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/10-9a--b--c--1000a-b-c #include <std ...
- django性能优化
1. 内存.内存,还是加内存 2. 使用单独的静态文件服务器 3. 关闭KeepAlive(如果服务器不提供静态文件服务,如:大文件下载) 4. 使用memcached 5. 使用select_rel ...
- OAUTH 协议介绍
OAUTH 产生背景 随着互联网的深入发展,一些互联网巨头积累了海量的用户和数据.对于平台级软件厂商来说,用户的需求多种多样,变化万千 以一己之力予以充分满足,难免疲于本命.因此将数据以接口的形式开放 ...
- 新著作计划:《水利水电工程施工导流 水力计算与.NET编程》
目 录 第一篇 基础理论篇 第1章 施工导截流设计概述 第2章 基本水力计算 2.1 临界水深计算 2.2 正常水深计算 2.3 堰流水力计算 2.4 明渠流水力计算 2.5 管流水力计算 第3章 ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q94-Q96)
Question 94You need to create a custom application that provides users with the ability to create a ...
- Android—SQLITE数据库的设计和升降级
Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLite 只需要带一个动 ...
- Android logcat
logcat是Android中一个命令行工具,可以用于得到程序的log信息. 基本命令 logcat使用方法如下所示: [adb] logcat [<option>] ... [<f ...
- DOM解析XML文件
1.首先把第三方代码拖进工程 GDataXMLNode.h和GDataXMLNode.m这两个文件放进工程里面 2.引入libxml2库文件 3.将GDataXMLNode.h文件中的这两个东西在工程 ...
- Android Small插件化框架解读——Activity注册和生命周期
通过对嵌入式企鹅圈原创团队成员degao之前发表的<Android Small插件化框架源码分析>的学习,对Android使用的插件化技术有了初步的了解,但还是有很多需要认真学习的地方,特 ...
- Reveal常用技巧(翻译来自Reveal官网blog)
翻译来自官网:http://revealapp.com/blog/reveal-common-tips-cn.html 以下基于Reveal 1.6. 用于快速上手的内置应用 刚刚下载Reveal,啥 ...