Genotype:

Genotype 是一个有限的基因序列。它是由大写的英文字母A-Z组成,不同的字母表示不同种类的基因。一个基因可以分化成为一对新的基因。这种分化被一个定义的规则集合所控制。每个分化的规则可以用三个大写字母A1A2A3表示,含义为基因A1可以分化成A2A3

我们用S代表特种基因,繁殖genotype是从特种基因序列开始。根据给定的规则,它由被选择控制规则对基因不断进行繁殖而成。

任务

从文本文件GEN.IN 读入一个定义的规则集和一个想生成的genotypes 单词序列

对每一个给定的 genotype,根据给定的分化规则,检查是否它能从某一个确定特种基因序列生成,如果能,找到最小的序列长度,

将结果写入文本文件GEN.OUT.

输入

在文件GEN.IN 的第一行有一个整数n, 1 <= n <= 10000. 下面n 每一行为一个分化规则. 这些规则都由包含A – Z的三个大写字母组成.

接下来有一个整数k, 1 <= k <= 10000. 接下来的k 行有一个 genotype. Genotype由没有空格的单词组成,最多100 个英文大写字母.

输出

在文件GEN.OUT中有k行,在第I行应写入: 一个正整数――需要生成第I个genotypes的最小长度;或者单词 NIE, 如果不能生成对应的genotype。

--------------------------------------------------------------------

Ps.数据已弱化,可水过- =

读取时用一个map[A][B]数组表示 字母AB能变成的字母

由于只有26个字母,可以用一个26位的二进制数表示

进行两次动归

  f[i][j]表示从字符串 从 i 到 j 能变成的字母,同理也是个二进制数

  f[i][j]=f[i][j] |map[c1][c2] 存在 (f[i][k]&char[c1]&&f[k+1][j]&char[c2])

不难得到那几段字符串能变成 ‘S’

在进行一次动归

  g[i]表示前 i 个字符能变成几个 ‘S’

g[i]=min(g[j]+1) 存在(f[i][j+1]&char['S'])

复杂度O(len^3*26^2)+O(len^2)

代码如下:

 #include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#define LL long long
#define INF 99999999
#define Min(num1,num2) if(num1>num2) num1=num2
#define Max(num1,num2) if(num1<num2) num1=num2
using namespace std;
int n,f[][],g[],num[],map[][];
string s;
void work(){
memset(f,,sizeof f);
cin>>s;
int l=s.size();
for(int k=,i=;i<l;k++,i++) f[k][k]=num[s[i]-'A'];
for(int p=;p<=l;p++)
for(int i=;i<=l;i++){
int j=i+p;
if(j>l) break;
for(int k=i;k<j;k++)
for(int ci=;ci<;ci++)
for(int cj=;cj<;cj++)
if((f[i][k]&num[ci])&&(f[k+][j]&num[cj]))
f[i][j]|=map[ci][cj]; }
int key='S'-'A';
for(int i=;i<=l;i++) g[i]=INF;
g[]=;
for(int i=;i<=l;i++)
for(int j=;j<=i;j++)
if((f[j][i]&num[key])&&g[j-]!=INF)
Min(g[i],g[j-]+);
g[l]==INF ? printf("NIE\n") : printf("%d\n",g[l]);
}
int main(){
freopen("GEN.in","r",stdin);
freopen("GEN.out","w",stdout);
scanf("%d\n",&n);
num[]=;
for(int i=;i<=;i++) num[i]=num[i-]<<;
for(int a,b,c,i=;i<=n;i++){
a=getchar()-'A';
b=getchar()-'A';
c=getchar()-'A';
map[b][c]|=num[a];
getchar();
}
int T;
scanf("%d\n",&T);
while(T--) work();
}

---------------------------------------------------------------------------

陨石的秘密:

公元11380年,一颗巨大的陨石坠落在南极。于是,灾难降临了,地球上出现了一系列反常的现象。当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点。经过一番侦察,科学家们发现陨石上刻有若干行密文,每一行都包含5个整数:

1 1 1 1 6

0 0 6 3 57

8 0 11 3 2845

著名的科学家SS发现,这些密文实际上是一种复杂运算的结果。为了便于大家理解这种运算,他定义了一种SS表达式:

1.  SS表达式是仅由‘{’,‘}’,‘[’,‘]’,‘(’,‘)’组成的字符串。

2.  一个空串是SS表达式。

3.  如果A是SS表达式,且A中不含字符‘{’,‘}’,‘[’,‘]’,则(A)是SS表达式。

4.  如果A是SS表达式,且A中不含字符‘{’,‘}’,则[A]是SS表达式。

5.  如果A是SS表达式,则{A}是SS表达式。

6.  如果A和B都是SS表达式,则AB也是SS表达式。

例如

()(())[]

{()[()]}

{{[[(())]]}}

都是SS表达式。

()([])()

[()

不是SS表达式。

一个SS表达式E的深度D(E)定义如下:

例如(){()}[]的深度为2。

密文中的复杂运算是这样进行的:

设密文中每行前4个数依次为L1,L2,L3,D,求出所有深度为D,含有L1对{},L2对[],L3对()的SS串的个数,并用这个数对当前的年份11380求余数,这个余数就是密文中每行的第5个数,我们称之为“神秘数”。

密文中某些行的第五个数已经模糊不清,而这些数字正是揭开陨石秘密的钥匙。现在科学家们聘请你来计算这个神秘数。

输入文件

共一行,4个整数L1,L2,L3,D。相邻两个数之间用一个空格分隔。

(0≤L1≤10,0≤L2≤10,0≤L3≤10,0≤D≤30)

输出文件

共一行,包含一个整数,即神秘数。

---------------------------------------------------------------------------

Ps。坑爹数学题- =

题目所求在 l1个{} l2个[]  l3个() 是有几个深度为 D 的 SS 串,

不妨设(g[l1][l2][l3][D])为使用 l1个{} l2个[]  l3个() 时深度不超过 D 的 SS 串数目

题目所求就是 g[l1][l2][l3][D]-g[l1][l2][l3][D-1]

转移:

可以由以下集中状态转移过来:

     (---------)-------------g[ 0 ][ 0 ][ i ][D-1]*g[l1      ][l2     ][l3-i-1]

[---------]-------------g[ 0 ][ j ][ i ][D-1]*g[l1      ][l2-j-1][l3-i   ]

{--------}-------------g[ k ][ j ][ i ][D-1]*g[l1-k-1][l2-j    ][l3-i   ]

累加起来就是 g[l1][l2][l3][D]

Ps.边界 g[0][0][0][D]=0

代码如下:

 #include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#define LL long long
#define INF 999999999
#define Min(num1,num2) if(num1>num2) num1=num2
#define Max(num1,num2) if(num1<num2) num1=num2
#define key 11380
//using namespace std ;
int f[][][][],L1,L2,L3,D;
int main(){
freopen("secret.in","r",stdin);
freopen("secret.out","w",stdout);
scanf("%d%d%d%d",&L3,&L2,&L1,&D);
for(int i=;i<=D;i++) f[][][][i]=;
for(int d=;d<=D;d++)
for(int l1=;l1<=L1;l1++)
for(int l2=;l2<=L2;l2++)
for(int l3=;l3<=L3;l3++)
if(l1||l2||l3){
int sum=;
//{ }
for(int i=;i<=l1;i++)
for(int j=;j<=l2;j++)
for(int k=;k<l3;k++)
sum=(sum+f[i][j][k][d-]*f[l1-i][l2-j][l3-k-][d])%key;
//[ ]
for(int i=;i<=l1;i++)
for(int j=;j<l2;j++)
sum=(sum+f[i][j][][d-]*f[l1-i][l2-j-][l3][d])%key;
//( )
for(int i=;i<l1;i++)
sum=(sum+f[i][][][d-]*f[l1--i][l2][l3][d])%key;
f[l1][l2][l3][d]=sum;
}
printf("%d",(f[L1][L2][L3][D]-f[L1][L2][L3][D-]+key)%key);
}

Genotype&&陨石的秘密的更多相关文章

  1. poj[1187][Noi 01]陨石的秘密

    Description 公元11380年,一颗巨大的陨石坠落在南极.于是,灾难降临了,地球上出现了一系列反常的现象.当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点.经过一番侦察,科 ...

  2. POJ 1187 陨石的秘密 (线性DP)

    题意: 公元11380年,一颗巨大的陨石坠落在南极.于是,灾难降临了,地球上出现了一系列反常的现象.当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点.经过一番侦察,科学家们发现陨石上 ...

  3. [POJ1187] 陨石的秘密

    问题描述 公元11380年,一颗巨大的陨石坠落在南极.于是,灾难降临了,地球上出现了一系列反常的现象.当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点.经过一番侦察,科学家们发现陨石 ...

  4. 【POJ1187】陨石的秘密

    题目大意: 定义一个串:只含有 '( )','[ ]','{ }',3种(6个)字符. 定义 SS 串: 空串是SS表达式. 若A是SS表达式,且A串中不含有中括号和大括号,则(A)是SS表达式. 若 ...

  5. 题解 【POJ1187】 陨石的秘密

    解析 考虑到数据范围,其实我们可以用记搜. 设\(f[a][b][c][d]\)表示还剩\(a\)个'{}',\(b\)个"[]",\(c\)个"()",深度\ ...

  6. AcWing 317. 陨石的秘密

    1 -> {} 2 -> [] 3 -> () \(f[d][a][b][c]\) 表示 \([i * 2 - 1, j * 2]\) 这段区间 深度为 d \(1\) 有 \(a\ ...

  7. 别人整理的DP大全(转)

    动态规划 动态规划 容易: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ...

  8. dp题目列表

    此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...

  9. dp式子100个……

    1.        资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2.        资源问题2------01背包问题F[I,j]:=max(f[i- ...

随机推荐

  1. 360极速浏览器在XP系统下的一个bug

    今天在做页面开发的时候,发现360浏览器在XP系统下不支持focus事件,而主流的IE(包括IE6),firefox,chrome都没有这个问题.前段开发的悲剧啊,各种浏览器兼容性的问题.

  2. Ajax--1

    1.Ajax:组合利用javascript.XML和DOM等技术,在无需要刷新页面的前提下实现浏览器与服务器通信.它在用户和服务器之间引入了一个中间层,负责转发用户界面和服务器之间的交互.在服务器处理 ...

  3. session 保存在指定的数据表,cookie设置

    首先建立数据表,可在ThinkPHP/Extend/Driver/Session/SessionDb.class.php中copy代码 在配置文件中配置: 'SESSION_TYPE' => ' ...

  4. c++与C# winform的消息通讯--(结构体与byte数组的使用)

    近期正在做一个蓝牙驱动的使用程序,其中有一块从c++发送数据到C#的部分,网上查了很多资料,大多都是介绍如何通过调用函数获取用户数据.并且在消息发送中,很少介绍如何发送一个结构体,并且结构体里面有 b ...

  5. ~/.vimrc config

    runtime! debian.vim "设置编码 set encoding=utf- set fencs=utf-,ucs-bom,shift-jis,gb18030,gbk,gb2312 ...

  6. “T”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法

    最近在项目中,使用EF编程时,在使用泛型类型的过程中,写了一上午,结果生成时,编译不通过,报出如下错误: “T”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法.如图: 找了好久,终 ...

  7. myeclipse使用SVN团队开发

    很多时候我们做项目都是已一个团队一起开发,所以我们可以选择SVN开发工具. 一:了解SVN的使用流程: 1).有一个服务端,他可以在上面添加一个项目,添加成员 2).myeclipse需要安装svn的 ...

  8. linux下使用NFS挂载文件系统

    转自linux如何使用NFS挂载文件系统 设备:一台服务器和一台客户端,这里我们把装在PC机上的RedHat作为服务器,而客户端则是嵌入式linux开发板. 环境:开发板已启动,连接好串口和网线,串口 ...

  9. Hibernate 注解 没有加@Column一样会在数据库创建这些字段

    Hibernate 注解 没有加@Column一样会在数据库创建这些字段 如下一个注解类: package com.hyy.hibernate.one_to_many.domain; import j ...

  10. 关于后缀数组的倍增算法和height数组

    自己看着大牛的论文学了一下后缀数组,看了好久好久,想了好久好久才懂了一点点皮毛TAT 然后就去刷传说中的后缀数组神题,poj3693是进化版的,需要那个相同情况下字典序最小,搞这个搞了超久的说. 先简 ...