sgu273:Game Po(dp)
2015-06-20 12:43
323 查看
题目大意:
~~~~~~给定一个由b,r,y,wb,r,y,w构成的字符串和相应的映射列表。
~~~~~~这里的映射指的是若有映射(a,b)→c(a,b,c(a,b)\rightarrow c(a,b,c可相同且均是b,r,y,wb,r,y,w其中的一个)),那么字符串中的abab可以替换成cc((一种替换无次数限制)),问在经过多次替换后,可以留下的唯一一个字母有哪些。
分析:
~~~~~~fi,j,rf_{i,j,r}表示字符串中i∼ji\sim j这一段可以替换成字符rr,方程很显然就是:
~~~~~~~~~~~~~~~~~~~~~~fi,j,r=max{fi,k,p&fk+1,j,q(f_{i,j,r}=\max \{f_{i,k,p}&f_{k+1,j,q}(存在映射(p,q)→r(p,q)\rightarrow r)})\}
AC code:
~~~~~~给定一个由b,r,y,wb,r,y,w构成的字符串和相应的映射列表。
~~~~~~这里的映射指的是若有映射(a,b)→c(a,b,c(a,b)\rightarrow c(a,b,c可相同且均是b,r,y,wb,r,y,w其中的一个)),那么字符串中的abab可以替换成cc((一种替换无次数限制)),问在经过多次替换后,可以留下的唯一一个字母有哪些。
分析:
~~~~~~fi,j,rf_{i,j,r}表示字符串中i∼ji\sim j这一段可以替换成字符rr,方程很显然就是:
~~~~~~~~~~~~~~~~~~~~~~fi,j,r=max{fi,k,p&fk+1,j,q(f_{i,j,r}=\max \{f_{i,k,p}&f_{k+1,j,q}(存在映射(p,q)→r(p,q)\rightarrow r)})\}
AC code:
[code]#include <cstdio> #include <cmath> #include <cstdlib> #include <cstring> #include <cctype> #include <algorithm> #include <string> #include <sstream> #include <iostream> #include <map> #include <set> #include <list> #include <stack> #include <queue> #include <vector> #define pb push_back #define mp make_pair typedef long long LL; typedef double DB; typedef long double LD; using namespace std; const int MAXN = 209; const int MAXM = 19; const int SIGMA = 4; int s[SIGMA]; int Map[300]; char str[MAXN]; int n, seq[MAXN]; bool cap[SIGMA][SIGMA][SIGMA]; bool f[MAXN][MAXN][SIGMA]; char name[5] = "bryw"; bool ans[SIGMA]; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif Map['b'] = 0, Map['r'] = 1, Map['y'] = 2, Map['w'] = 3; for(int i = 0; i < 4; ++i) scanf("%d", s+i); scanf("\n"); for(int i = 0; i < 4; ++i) for(int j = 0; j < s[i]; ++j) { char a = getchar(), b = getchar(); scanf("\n");cap[Map[a]][Map[b]][i] = true; } scanf("%s", str), n = strlen(str); for(int i = 0; i < n; ++i) { seq[i+1] = Map[str[i]]; f[i+1][i+1][seq[i+1]] = true; } bool flag = false; for(int l = 2; l <= n; ++l) for(int i = 1, j; i+l-1 <= n; ++i) { j = i+l-1; for(int k = i; k < j; ++k) for(int p = 0; p < 4; ++p) if(f[i][k][p]) for(int q = 0; q < 4; ++q) if(f[k+1][j][q]) for(int r = 0; r < 4; ++r) if(cap[p][q][r]) f[i][j][r] = true; } for(int i = 0; i < 4; ++i) if(f[1] [i]) flag = ans[i] = true; if(!flag) puts("Nobody"); else { for(int i = 0; i < 4; ++i) if(ans[i]) putchar(name[i]); puts(""); } #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }
相关文章推荐
- PHP传值、传引用
- 关于独立游戏的一些素材网站
- 单例模式
- 单例模式
- 用refine函数2次加密后的单元标号阵elem,可以看出总体节点编号的分布情况
- 再次简介grep命令和wc命令(某公司招聘笔试试题)
- 将代码段和数据段分离在cache和uncache空间
- JAVASE学习笔记:第十三章 多线程和网络编程
- C#文件重命名的处理方法 (转载)
- assign()的使用以及在构造对象时不能使用
- JAVASE学习笔记:第十二章 集合
- Java编程思想学习笔记——初始化与清理
- 【Linux探索之旅】第一部分第二课:下载Linux,免费的噢
- ubuntu系统美化
- DataUml Design 课程6-DataUML Design 1.1版本号正式宣布(支持PD数据模型)
- 利用kickstart实现自动化安装
- cocos2dx单场景和多场景的生命周期
- 算法学习之链表反转
- 强制链接静态库所有符号(包括未被使用的)
- C#网络编程(接收文件) - Part.5