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
代码:
View Code
解法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
相关文章推荐
- UVALive 6257 Chemist's vows 判断一个字符串是否由n中的某些字符串组成 dp
- Chemist's vows - UVALive 6257
- Uvalive 6259 Word equations dfs+dp
- [UVALive 6661 Equal Sum Sets] (dfs 或 dp)
- UVALive6257-剪枝|dp-Chemist's vows
- UVALive 3363 String Compression (区间DP,4级)
- UVALive 3363 String Compression (区间DP,4级)
- UVALive 4864 数位dp
- uva 624 CD (DP + DFS 输出方案)
- UVA_10716 - Evil Straw Warts Live-------水题(模拟)
- UVAlive 5875 DP
- UVALive 3782 Bigger is Better(数位DP + 大数)
- 【模拟】 UVALive 4168 Lampyridae Teleportae
- UVALive 2031 Dance Dance Revolution (舞步转移,状态压缩DP,4级)
- UVAlive 6131 dp+斜率优化
- UVALive 3305Tour(双调DP)
- UVALive 4256 Salesmen (树DP,4级)
- UVALive 3497 brainfuck [模拟]
- dp 专题系列(一)(UVa 10635,UVa 11825,UVa 10859,Uva LiveArchive 3882 )
- UVALive 4329 Ping pong(解法二:树状数组)