ZOJ问题解决思路

明天要去北京面试啦..祝自己好运 临行前做点练习
来自 2010年浙江大学计算机及软件工程研究生机试真题 的ZOJ问题
原来这就是ACM水题啊……
题目描述:
对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC。

是否AC的规则如下:
1. zoj能AC;
2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者为空;
3. 若azbjc 能AC,则azbojac也能AC,其中a,b,c为N个'o'或者为空;
输入:
输入包含多组测试用例,每行有一个只包含'z','o','j'三种字符的字符串,字符串长度小于等于1000。
输出:
对于给定的字符串,如果能AC则请输出字符串“Accepted”,否则请输出“Wrong Answer”。
样例输入:
zoj
ozojo
ozoojoo
oozoojoooo
zooj
ozojo
oooozojo
zojoooo
样例输出:
Accepted
Accepted
Accepted
Accepted
Accepted
Accepted
Wrong Answer
Wrong Answer

 

说下思路:

       先分析样例,如oozoojoooo<=oozojoo<=规则2,zooj<=zoj<=规则1。敏感地发现z和j是分界点,那就把字串分成三部分。同时可以发现,当然2也是来自1的,规则1是基本,2、3都是它的推理,再结合样例,就可以想象棵树了。设函数P(x,y,z),其中x、y、z分别是字串分割后那三部分里各有的o的数量,函数值为1表接受,为0表拒绝。如P(0,1,0)=1,P(x,1,x)=1,P(1,2,2)=1。

 

      现在假设拿到个P(x,y,z),x,y,z均不小于0

  P(x,y,z)    =1,                若  x=z 且 y=1   ——规则1,2

                 =P(x,y-1,z-x), 若y>1 且z>x      ——规则3

                 =0,                 其他

  

      这样就可以用递归实现了。动态规划的话,因为不是求所有可能,所以可以用带备忘的自顶向下法(top-down width memoization)。                  

 

你可能感兴趣的:(ACM,ZOJ)