您的位置:首页 > 其它

UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)

2014-07-29 22:15 393 查看
题意:给一个元素周期表的元素符号(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

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
#define N 50007

string single[25] = {"h","b","c","n","o","f","k","p","s","y","i","w","u","v"};
string ss[130] = {"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
;
int vis
;

int main()
{
int t,len,i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%s",st);
len = strlen(st);
int flag = 1;
memset(vis,0,sizeof(vis));
for(i=0;i<len;i++)
{
if(vis[i])
continue;
string S = "";
S += st[i];
for(j=0;j<14;j++)
{
if(single[j] == S)
break;
}
if(j == 14)  //not single
{
if(i > 0 && !vis[i-1])
{
S = st[i-1]+S;
for(j=0;j<100;j++)
{
if(ss[j] == S)
break;
}
if(j != 100)  //pre match
{
if(i < len-1)
{
string ks = "";
ks += st[i];
ks += st[i+1];
for(k=0;k<100;k++)
{
if(ss[k] == ks)
break;
}
if(k != 100)  //back match
vis[i] = 0;
else   //back not match
vis[i] = 1;
}
}
else   //pre not match
{
if(i < len-1)
{
string ks = "";
ks += st[i];
ks += st[i+1];
for(k=0;k<100;k++)
{
if(ss[k] == ks)
break;
}
if(k != 100)  //back match
vis[i+1] = 1;
else   //back not match
{
flag = 0;
break;
}
}
else
{
flag = 0;
break;
}
}
}
else
{
if(i < len-1)
{
string ks = "";
ks += st[i];
ks += st[i+1];
for(k=0;k<100;k++)
{
if(ss[k] == ks)
break;
}
if(k != 100)  //back match
vis[i+1] = 1;
else   //back not match
{
flag = 0;
break;
}
}
else
{
flag = 0;
break;
}
}
}
else   //single
{
if(i > 0 && !vis[i-1])
{
S = st[i-1]+S;
for(j=0;j<100;j++)
{
if(ss[j] == S)
break;
}
if(j != 100)  //pre match
{
if(i < len-1)
{
string ks = "";
ks += st[i];
ks += st[i+1];
for(k=0;k<100;k++)
{
if(ss[k] == ks)
break;
}
if(k != 100)  //back match
vis[i] = 0;
else   //back not match
vis[i] = 1;
}
}
else   //pre not match
{
if(i < len-1)
{
string ks = "";
ks += st[i];
ks += st[i+1];
for(k=0;k<100;k++)
{
if(ss[k] == ks)
break;
}
if(k != 100)  //back match
vis[i] = 0;
else   //back not match
vis[i] = 1;
}
else
vis[i] = 1;
}
}
else
{
if(i < len-1)
{
string ks = "";
ks += st[i];
ks += st[i+1];
for(k=0;k<100;k++)
{
if(ss[k] == ks)
break;
}
if(k != 100)  //back match
vis[i] = 0;
else   //back not match
vis[i] = 1;
}
else
vis[i] = 1;
}
}
}
if(flag)
puts("YES");
else
puts("NO");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: