SPOJ ALPHA CODE

时间:2012-01-29 04:19:01

标签: c++ dynamic-programming

我在SPOJ上练习动态编程问题。但我不知道如何解决这个问题。

任何人都可以帮助我解决SPOJ上的http://www.spoj.pl/problems/ACODE/问题 谢谢!

  爱丽丝和鲍勃需要彼此发送秘密消息   讨论编码邮件的方法:

     

Alice:“我们只使用一个非常简单的代码:我们将为代码分配'A'   单词1,'B'将为2,依此类推,直到'Z'被指定为26。“

     鲍勃:“这是一个愚蠢的代码,爱丽丝。假设我发给你'BEAN'这个词   编码为25114.您可以通过多种方式对其进行解码!“   爱丽丝:“当然可以,但你会得到什么样的话?以外   'BEAN',你会得到'BEAAD','YAAD','YAN','YKD'和'BEKD'。我认为   你将能够找出正确的解码。为什么会这样   你还给我发了“BEAN”这个词吗?“鲍勃:”好吧,也许这很糟糕   例如,但我打赌你,如果你有一个长度为5000的字符串   会有很多不同的解码,你会发现很多   至少有两个不同的意义。“爱丽丝:”多少个   不同的解码?“Bob:”Jillions!“

     

出于某种原因,爱丽丝仍然不相信鲍勃的论点,所以她   需要一个程序来确定可以有多少解码   使用她的代码获取给定字符串。

     

输入

     

输入将包含多个输入集。每组将包括一个   表示有效加密的最多5000位的单行   (例如,没有行以0开头)。没有空间   数字之间。输入行'0'将终止输入和   不应该被处理。

     

输出

     

对于每个输入集,输出可能的解码数   输入字符串。所有答案都在64位签名的范围内   整数。

     

实施例

     

输入:

     

25114 1111111111 3333333333 0

     

输出:

     

6 89 1

2 个答案:

答案 0 :(得分:2)

从左侧开始,执行以下操作:

  1. 使用先前针对序列中的点计算的有限数量的值,查找序列可被解释为多少个单词(称为x [k])到此时为止。
  2. 转到下一点。
  3. 如果仍然无法获取,可以查看Welcome to Code Jam问题。它有点类似,并且有现成的解释。

答案 1 :(得分:0)

如果你有一串数字作为S,那么,有两种情况可能: 1)只有第一个数字对应一个字母 2)前两个数字对应于字母表。但是,只有前两位数字不能形成大于26的数字。

设S的大小为n。设f(Si)为最后i个数字形成的串数。请注意,您必须找到f(Sn)。 使用上述两个规则,您可以将关系编写为:

如果前两位数字形成一个数字< = 26:

f (S k )= f (S k-1 )+ f < / i>的(S <子> K-2

如果前两位数字形成一个数字&gt; 26:

f(S_k) = f(S_{k-1})