嗨,给定的代码在这里
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 修复了整数溢出。但是问题在于时间。当我提交代码时,在线法官会显示已超过时间限制。请帮助我解决此问题。
答案 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)
这看起来是一个非常标准的动态编程问题,关键是记住您的功能。由于这是一个问题,因此我将不提供任何代码,但将向您解释您需要做什么。您应该维护一个值数组,并在从函数返回之前,使用返回值更新数组中的值。在函数开始时,您将检查该数组是否已经具有返回值,如果已经返回,则只需返回该值即可。