一道ACM程序题 我为什么一直显示 Time Limit Exceeded 不知是哪里超时了 求大神解答

题目描述

给定一个函数 f(a, b, c):

如果 a ≤ 0 或 b ≤ 0 或 c ≤ 0 返回值为 1;

如果 a > 20 或 b > 20 或 c > 20 返回值为
f(20, 20, 20);

如果 a < b 并且 b < c 返回 f(a, b, c−1) +
f(a, b−1, c−1) − f(a, b−1, c);

其它情况返回 f(a−1, b, c) + f(a−1, b−1, c) + f(a−1,
b, c−1) − f(a-1, b-1, c-1)。

看起来简单的一个函数?你能做对吗?

输入

输入包含多组测试数据,对于每组测试数据:

输入只有一行为 3 个整数a, b, c(a, b, c <
30)。

输出

对于每组测试数据,输出函数的计算结果。

示例输入
1 1 1
2 2 2

示例输出
2
4

#include<iostream>
using namespace std;
int f(int a,int b,int c)
{
if(a<=0||b<=0||c<=0)
{
return 1;
}else
if(a>20||b>20||c>20)
{
return f(20,20,20);
}else
if(a<b&&b<c)
{
return f(a,b,c-1)+f(a,b-1,c-1)-f(a,b-1,c);
}else
return f(a-1,b,c)+f(a-1,b-1,c)+f(a-1,b,c-1)-f(a-1,b-1,c-1);
}
int main()
{
int a,b,c;
while(cin>>a>>b>>c)
{
cout<<f(a,b,c)<<endl;
}
return 0;
}

这样有很多都重复计算了,这题答案只有20 × 20 × 20个,先把所有答案算出来,在输出就行了。
温馨提示:内容为网友见解,仅供参考
无其他回答

Time Limit Exceeded和Output Limit Exce
在ACM编程竞赛中,遇到"Time Limit Exceeded"(超时)问题通常是由于程序运行效率低下,耗时过长。要解决这个问题,关键在于优化算法和代码结构,以提升执行效率。相比之下,"Output Limit Exceeded"(输出限制超出)虽然名称上看似与输出有关,实际上多数情况源于输入处理不当。比如,C语言在ACM中常常通过wh...

acm1597题没过Time Limit Exceeded如何解?
在解决 ACM 1597 题目时,遇到“Time Limit Exceeded”(超时)问题的处理方法至关重要。通常情况下,超时问题的根源在于程序的执行效率或者算法的优化空间。针对这个问题,我们可以从多个角度入手进行优化,以提升程序执行效率,避免超时错误的发生。以下将从代码优化、数据结构选择和算法改进三个方面提供一些...

acm的一道问题,不知道为什么Time limit exceeded
错误时说你时间超时,就是程序运行的有点慢,我没看题意,但看了你的程序,感觉在i从1开始加,然后加这个循环可以省略的,你可以(x[l]-1-i)*2,然后开根号结果为y,然后判断y*(y+1)\/2+i判断是否等于x[i]-1, 因为从1开始加的等差序列,求和不就是首项加末项,乘以项数,除以2。你可以...

acm的一道问题,不知道为什么Time Limit Exceeded
如果你TLE的话,那么这就一定是一道卡常数时间的题了。题意很简单,从你代码中也可以看出,你对每一个点的周围8个均做了判断,那么这一块计算的最大复杂度就是100*100*8,其实只要建一个辅助数组f[101][101],f[i][j]表示从左上角(0,0)到(i,j)的雷的总数量,那么f[i][j] = f[i-...

acm中Time Limit Exceeded怎么解决
while(scanf("%d",&n)<=i) \/\/这句有问题scanf接收一个值的输入每次的返回值一样都是1,这样程序会无休止运行 ,把这句改成for语句

acm_A hard puzzle 为什么会出现 Time Limit Exceeded 错误...
第一个方法肯定不行, 2^30次循环,必须超时。第二个方法死循环。第一个方法明明是 while(cin>>n>>num) 这样遇到文件尾就会退出。你用while(1)这是永远出不来的。。你是用了周期性吧,但是肯定不会超时。把死循环解决的话。其实你可以用这样, a^b = (a^2)^(b\/2) = a^(2*2*2...

杭电acm1003 请教大神们看看为什么总显示 Time Limit Exceeded
那几个for太坑了,虽然看不懂你用那几个for用来干嘛,还有max,不知道你为什么把它全部加起来,但复杂度高是逃不了了的。这道题感觉你思路不清楚,应该用动态规划做,而且不用开数组,边输入边处理数据好了,核心只要一个for就够了。不懂你可以追问的。

ACM总是Time Limit Exceeded,到底是WRONG ANSWER还是算法太暴力,还是死...
你的代码是没有错的 只是某个tesecase执行时间超过的限制 你想想假如我n=50000 q=100000 你的程序最好的情况要查找多少次? 100000 * (1 + 2 + 3 + 。。。 50000)你要取巧已空间换时间 定义一个 100001 的数组a , i(1-n) 每输入一个数 k a[k] = i 那么下面...

acm c语言问题求助 总是time limit exceeded
acm你知道这是超时了对吧,就那你这个来说,那c也可以从两者最大值开始 也许你应该换种算法,你这个是最简单的枚举,网上自己百度吧,毕竟没你的OJ系统,没办法用源码测试

ACM Time Limit Exceeded求解释
这其实就是计算斐波那契数列,f(n) = f(n-1) + f(n-2)递归当然会超时,重复计算太多,可以用备忘录方法、动态规划 或者 只用两个变量计算,int i, p = 1, q = 0;for(i=0; i<M; i++){ q += p;p = q-p;} 最后q就是f(M)

相似回答
大家正在搜