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), ...
随机推荐
- .NET破解之百分百营销软件系列
今天在52中看到了一个邮件批量发送工具,感觉不怎么好用,百度一下,找到了百分百系统,虽然也不怎么好用,但还是忍不住P它. 官网:http://www.100qunfa.com/ 百分百不加群提取群成员 ...
- Android Service获取当前位置(GPS+基站)
需求详情:1).Service中每隔1秒执行一次定位操作(GPS+基站)2).定位的结果实时显示在界面上(要求得到经度.纬度)技术支持:1).获取经纬度通过GPS+基站获取经纬度,先通过GPS来获取, ...
- Spark中的RDD操作简介
map(func) 对数据集中的元素逐一处理,变为新的元素,但一个输入元素只能有一个输出元素 scala> pairData.collect() res6: Array[Int] = Array ...
- Docker: 解决Centos 7中Permission Denied的问题
当用docker -v挂载volume后,会出现Permission Denied的问题,这有时是因为SeLinux导致的.解决方法如下: chcon -Rt svirt_sandbox_file_t ...
- 【读书笔记】iOS-属性列表
一,在Cocoa中,有一类名为属性列表的对象,常简写为plist.这些列表包含Cocoa知道如何操作的一组对象.具体来讲,Cocoa如何知道将这们保存在文件中并进行加载.属性列表类包括NSArray, ...
- MAC中安卓开发环境的下载(转)
今天终于为我的Macbook Pro Retina搭建好了Android开发环境,几经折磨,差点放弃了: 总结如下:1.最好选择ADT Bundle,这里面已经集成好了Eclipse.ADT.Andr ...
- 基础学习day02--标识符、关键字、数据类型与运算符
一.标识符和关键字 关键字: 就是被java语言赋予了特殊含义的单词. 特点就是所有的关键字都是小写. 标识符: 就是给包.类.接口.方法.变量名起的名字. 规则:1.以数字.字母._以及$符 ...
- Swift字符与字符串
学习来自<极客学院:Swift中的字符串和集合> 工具:Xcode6.4 直接上基础的示例代码,多敲多体会就会有收获:百看不如一敲,一敲就会 import Foundation /**** ...
- android 之 桌面的小控件AppWidget
AppWidget是创建的桌面窗口小控件,在这个小控件上允许我们进行一些操作(这个视自己的需要而定).作为菜鸟,我在这里将介绍一下AppWeight的简单使用. 1.在介绍AppWidget之前,我们 ...
- 线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理
原文链接地址:http://www.cppblog.com/Tim/archive/2012/07/04/181018.html 本文为线程本地存储TLS系列之分类和原理. 一.TLS简述和分类 我们 ...