foob​​ar挑战:Minion的无聊游戏

时间:2015-05-29 04:45:53

标签: java algorithm

修改:人们对another的这个问题感到困惑。这两个问题都与Foobar的挑战相同。另一个问题是要求一种方法比指数时间或欧米茄(答案)蛮力搜索更好,因为蛮力搜索花了太长时间。那里的答案建议使用动态编程,这是一个好主意,比蛮力搜索或回溯要快得多,尽管不是最好的。这个问题开始使用动态编程,它适用于5个测试中的4个,但是对于第5个也许是最大的测试用例似乎得到了错误的答案。它不会花太长时间。它完成但得到了错误的答案。另一个问题的答案对这个问题没有帮助,对这个问题的答案也没有帮助,所以它们不是重复的。它们涉及同一任务的不同方面。

我正在开展Foobar挑战赛,试图确定可能的数量" Winning"个人可以使用3面模具进行滚动组合。模拟用户将在1维"游戏板"上滚动t次。这是n个空格宽。 3面模具有3个可能的值:左(-1),保持(0),右(1)。用户从位置' 0'开始。在板上。如果你在0并且你滚动-1(左)那么游戏无效。如果你在最后的广场上,唯一有效的掷骰是0(停留)。目标是确定用户可以进行的滚动组合的总量,最终其标记位于最后一个方格上。 (阅读以下全面的挑战说明)。

我有一个半功能解决方案来应对这一挑战;但是,当我提交它进行审核时,它会在5个测试场景中失效1个;问题是,Foobar没有透露失败的具体情况,它只是说“测试5失败了!”#39;。是否有人能够查看我的Java代码(如下所示),看看我缺少什么?

这是我的代码:

public static int answer(int t, int n) { 
if ((n - t) > 1) {
    return 0;
}
if (n == 2) {
    return t * 1;
}
if (t == n) {
    return n;
}
// Use dynamic programming:
int lst[] = new int[n]; // lst[k] holds the # valid paths to position k using i-1 steps
int lst2[] = new int[n]; // put # valid paths to position k using i steps into lst2[k]
int total = 0;
lst[0] = 1;
lst[1] = 1;
int max = 1;
for (int i = 1; i < t; i++) {
    lst2 = new int[n];
    if (max < (n - 1)) {
        max++;
    }
    for (int j = 0; j < n && j < (max + 1); j++) {
        if (j == 0) {
            lst2[j] = lst[j] + lst[j + 1];
        } else if (j == max) {
            if (j == (n - 1)) {
                total += lst[j - 1];
            } else {
                lst2[j] = lst[j - 1];
            }
        } else {
            lst2[j] = lst[j - 1] + lst[j] + lst[j + 1];
        }
    }
    lst = lst2;
}
return total % 123454321;
}

原始挑战文本

你有它。又一个毫无意义的无聊&#34;由布尔教授无聊的仆从创造的游戏。

游戏是单人游戏,在水平行中有n个正方形的棋盘上玩。小兵在最左边的方格上放置一个标记并滚动一个特殊的三面模具。

如果骰子滚动&#34;左&#34;,仆从将令牌移动到当前所在位置左侧的方形空间。如果左边没有方格,则游戏无效,然后重新开始。

如果骰子滚动&#34;停留&#34;,则令牌保持原样。

如果骰子滚动&#34;右&#34;,小兵将令牌移动到正方形,即当前所在位置的一个空格。如果右侧没有方格,则游戏无效,您将重新开始。

目标是将骰子精确地滚动t次,并在最后一个滚动的最右边的方格上。如果你在完成滚动之前落在最右边的正方形上,那么唯一有效的骰子滚动就是滚动一个&#34; Stay&#34;。如果您滚动任何其他内容,则游戏无效(即,您无法从最右边的方块向左或向右移动)。

为了让它更有趣,仆从有排行榜(每个n,t对一个),每个仆从提交他刚玩过的游戏:掷骰子的顺序。如果某个小兵已经提交了完全相同的序列,则他们无法提交新条目,因此排行榜中的条目对应于可玩的独特游戏。

由于小兵经常在他们的移动设备上刷新排行榜,作为一个渗透黑客,你有兴趣了解排行榜可能拥有的最大可能尺寸。

写一个函数答案(t,n),给出骰子数量t和棋盘n中的方格数,返回模数为123454321的唯一游戏的可能数量。即如果总数是S,然后在将S除以123454321时返回余数,余数应为0到123454320(含)之间的整数。

n和t将是正整数,不超过1000.n将至少为2.

语言 要提供Python解决方案,请编辑solution.py要提供Java解决方案,请编辑solution.java

测试用例

输入:(int)t = 1(int)n = 2输出:(int)1

输入:(int)t = 3(int)n = 2输出:(int)3

2 个答案:

答案 0 :(得分:1)

计数在t中呈指数增长。我的猜测是错误是你溢出整数范围。减少中间结果mod m,或使用java.math.BigInteger

答案 1 :(得分:0)

好的,简单一点是,int溢出有问题。但是,您不需要使用BigInteger之前的更大容器。您需要存储第二个数组的所有内容是余数ex lst2[j] = (lst[j - 1] + lst[j] + lst[j + 1]) % 123454321;。通过这样做,您的值永远不会超过123454321,这将很容易适合整数。然后在我使用total %= 123454321;的每次迭代之后,你只需要返回总数。由于我们只是添加修改中间结果的路径,因此只需将其缩减回可管理的数字。