如何解决超过时限

时间:2020-04-22 15:35:45

标签: c

嗨,给定的代码在这里

int a, b, c, d, e, f;
int fn( int n ) {
    if( n == 0 ) return a;
    if( n == 1 ) return b;
    if( n == 2 ) return c;
    if( n == 3 ) return d;
    if( n == 4 ) return e;
    if( n == 5 ) return f;
    return( fn(n-1) + fn(n-2) + fn(n-3) + fn(n-4) + fn(n-5) + fn(n-6) );
}
int main() {
    int n, caseno = 0, cases;
    scanf("%d", &cases);
    while( cases-- ) {
        scanf("%d %d %d %d %d %d %d", &a, &b, &c, &d, &e, &f, &n);
        printf("Case %d: %d\n", ++caseno, fn(n) % 10000007);
    }
    return 0;
}

它有两个问题。一种是整数溢出。另外一个是已超过时间限制。我使用 long int 修复了整数溢出。但是问题在于时间。当我提交代码时,在线法官会显示已超过时间限制。请帮助我解决此问题。

2 个答案:

答案 0 :(得分:2)

您的方法具有指数 time complexity,远非理想。 好消息是有一个简单易行的修复方法。

您可以做的只是创建一个数组,其大小为 n 的最大可能值。我认为它可能类似于 10^5,这是此类问题的标准。

让我们称这个数组为 ans[]。手动设置 ans[] 的前 6 个值,其余的,运行一个循环,执行如下操作:

ans[i] = (ans[i-1] + ans[i-2] + ans[i-3] + ans[i-4] + ans[i-5] + ans[i-6]) % 1000000007

现在,对于每种情况,您只需打印 ans[n] 作为您的答案。 (或 ans[n-1] 取决于您存储元素的方式。

另外,您可能需要检查用于取模的数字。它应该是 10^9 + 7,你的缺少两个 0。

答案 1 :(得分:1)

这看起来是一个非常标准的动态编程问题,关键是记住您的功能。由于这是一个问题,因此我将不提供任何代码,但将向您解释您需要做什么。您应该维护一个值数组,并在从函数返回之前,使用返回值更新数组中的值。在函数开始时,您将检查该数组是否已经具有返回值,如果已经返回,则只需返回该值即可。

Read more about memoization here