第一行是数字,int x。以下m行包含字母。在m行之后,你读入一个数字,直到。
目标是从每行的1个字母的递归中找到soluiton数字int y。
问题表明,有一个更快的解决方案,可以避免通过每个可能的密码。这就是我的问题所在。如何才能做到这一点?任何帮助将不胜感激。
答案 0 :(得分:-1)
这并不复杂。您可以计算m行中的字母数。然后计算每行字母的值,该值指定跳过多少可能的解决方案,如果跳过参考行中的一个字母。可视化:
abc -> 3 letters
xy -> 2 letters
dmnr -> 4 letters
如果你从第n个字母跳到“abc”行中的第n + 1个字母,你跳过尽可能多的可能解决方案,因为每个后续行的长度的乘积都说明了。所以你跳过2 * 4解决方案 - > 8 solutions
。
为xy重复此步骤 - > 4 solutions
已跳过。
最后一行跳过alwasy 1 solution
,因为它本身就是递归路径。
所以现在你知道,如果你跳过一些特定的字母,你会跳过多少解决方案。最后一件事很简单。从1开始,将每行的计算值加到数字上,直到达到r为止。
表示在c ++中:
int v = 1, r=10;
int i1=0, i2=0, i3=0;
while (v<=r-8) {
i1++;
v+=8;
}
while (v<=r-4) {
i2++;
v+=4;
}
while (v<=r-1) {
i3++;
v++;
}
现在i1是你需要在“abc”行中使用的字母索引,i2是“xy”中字母的索引,而“dmnr”中的i3是所有。该算法应以i1 = 1,i2 = 0,i3 = 1 - >结束; “b”+“x”+“m”
我希望这会有所帮助。它删除了递归,但这没问题,是吗? ;)