现在的位置: 首页 > 综合 > 正文

UVA 620 Cellular Structure

2018年03月17日 ⁄ 综合 ⁄ 共 1075字 ⁄ 字号 评论关闭

大意:给定一些序列,由下列组成,然后判断一个字符串属于什么样的类型。

simple stage   O = A  
fully-grown stage       O = OAB 
mutagenic stage   O = BOA
Mutant                       O = other

思路:最开始时我没读懂题意,然后读了第二遍,然后是第三遍,最后发现,尼玛,这不就是编译原理里的上下文无关文法,还好我暑假看过一段时间的编译原理,要不是被这题目给绝对坑过了。

所谓的上下文无关文法就是给定几个算术表达式,然后通过一些相关的变化,可以推出另一个表达式。

回到题目,由图片可以知道, O = BOA,我们把BOA中的O看做一个表达式,这里O可以看做O = A | OAB | BOA,由此可知:

OAB推出的子串 OABAB, OABABAB,....AB的最后两位一定是AB。

同理BOA推出的子串 BBOAA, BBBOAAA等,这样的子串特定是:首字母为B,尾字母为A。

由1、2可以知道,他们的子串的长度一定是奇数,如果为偶数,那么字符串的类型一定是Mutant。

而O = A,则是 simple stage,同样为奇数。

至此,我们已经完整解答了本题,不过我还不清楚的是,这与动态规划有啥关系呢?

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <map>
#include <queue>
using namespace std;

char answer[10][110] = {"SIMPLE", "FULLY-GROWN", "MUTAGENIC", "MUTANT"};

char str[10010];

void read_case()
{
	scanf("%s", str);
}

void solve()
{
	int f;
	read_case();
	int len = strlen(str);
	if(len % 2 == 0)
	{
		f = 3;
	}
	else if(len == 1)
	{
		if(str[0] == 'A') f = 0;
		else f = 3;
	}
	else if(str[len-2] == 'A' && str[len-1] == 'B')
	{
		f = 1;
	}
	else if(str[0] == 'B' && str[len-1] == 'A')
	{
		f = 2;
	}
	else f = 3;
	printf("%s\n", answer[f]);
}

int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		solve();
	}
	return 0;
}

抱歉!评论已关闭.