D - Function Run Fun

We all love recursion! Don't we? 

Consider a three-parameter recursive function w(a, b, c): 

if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns: 


if a > 20 or b > 20 or c > 20, then w(a, b, c) returns: 
w(20, 20, 20) 

if a < b and b < c, then w(a, b, c) returns: 
w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) 

otherwise it returns: 
w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) 

This is an easy function to implement. The problem is, if implemented directly, for moderate values of a, b and c (for example, a = 15, b = 15, c = 15), the program takes hours to run because of the massive recursion.

Input

The input for your program will be a series of integer triples, one per line, until the end-of-file flag of -1 -1 -1. Using the above technique, you are to calculate w(a, b, c) efficiently and print the result.

Output

Print the value for w(a,b,c) for each triple.

Sample Input

1 1 1 
2 2 2 
10 4 6 
50 50 50 
-1 7 18 
-1 -1 -1

Sample Output

w(1, 1, 1) = 2 
w(2, 2, 2) = 4 
w(10, 4, 6) = 523 
w(50, 50, 50) = 1048576 
w(-1, 7, 18) = 1

用纯递归的思想会超时,用边搜索边记忆的思路 

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long 
using namespace std;
int  aa[21]={1,2,4,},t=0;
int bb[21][21][21];
int quick_mod(int n,int k)  快速幂求次方
{
    int  sum=1;
    n%=k;
    while(k!=0)
    {
        if(k&1)
        {
            sum=sum*n;
        }
        n=n*n;
        k>>=1;
    }
    return sum;
}
int dj(int a,int b,int c)
{
    if(a<=0||b<=0||c<=0)
    {
        return 1;
    }
    if(a>20||b>20||c>20)
    return dj(20,20,20);
    if(bb[a][b][c])         这很重要,没有这个,就是死循环
    return bb[a][b][c];
    if(a<b&&b<c)
    bb[a][b][c]=dj(a,b,c-1)+dj(a,b-1,c-1)-dj(a,b-1,c);
    else
    bb[a][b][c]=dj(a-1,b,c)+dj(a-1,b-1,c)+dj(a-1,b,c-1)-dj(a-1,b-1,c-1);   边搜索,边记忆
    return bb[a][b][c];
}
int main()
{
    int i,j,k,a,b,c;
    memset(bb,0,sizeof(bb));
    for(i=3;i<21;i++)
    {
        aa[i]=quick_mod(2,i);
    }
    
    while(~scanf("%d%d%d",&a,&b,&c))
    {
        if(a==-1&&b==-1&&c==-1)
        break;
        if(a==b&&b==c&&a<20)
        {
            printf("w(%d, %d, %d) = %d\n",a,b,c,aa[a]);
            continue;
        }
        if(a==b&&b==c&&a>20)
        {
            printf("w(%d, %d, %d) = %d\n",a,b,c,aa[20]);
            continue;
        }
        dj(a,b,c);
        printf("w(%d, %d, %d) = %d\n",a,b,c,dj(a,b,c));   我把这小写看成了大写。
    }
    return 0;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误发生可能是因为代码中存在括号、引号等符号不匹配的情况,或者代码中在语法上不正确的位置添加了HTML标签或其他非代码的内容。这个错误的消息提示是“ntaxerror: unexpected token '<' at new function (<anonymous>) at runcode2fun”,意思是在代码的某个位置遇到了不期望的“<'”,而且这个错误发生在一个名为“runcode2fun”的函数中。要解决这个问题,可以检查代码中是否存在语法错误,或者尝试剪切并粘贴代码到其他的文本编辑器中,查看代码是否在其他地方被修改了。还可以尝试在代码中添加更多的注释来更好地理解代码的逻辑和运行过程,或者使用代码编辑器来自动检查和修复语法错误。最终,要保持代码的简洁、清晰和易于阅读,以便更容易地理解和修改。 ### 回答2: 在编写代码时,若出现了“syntaxerror: unexpected token '<' ”的错误提示,意味着代码中出现了不被识别的符号“<”,通常这种情况发生在HTML文件或其他文档中的JavaScript代码中,因为“<”通常是HTML标签的开始符号。在JavaScript中,"<"可以表示比较运算符或位运算符,但如果这个符号出现在了错误的位置,就会引发语法错误的异常。 而此错误出现在“runcode2fun”函数中,说明可能是这个函数调用了其他包含HTML标签的函数或代码引起的。解决这个问题的方法可以尝试检查一下所使用的函数或引入的代码是否要求混合使用HTML和JavaScript,如果是的话,可以将HTML和JavaScript代码分开编写。另外,还有可能是代码在运行过程中动态生成了HTML代码,可以尝试使用Javascript的模板引擎等框架,将代码和模板进行分离。 总之,出现“syntaxerror: unexpected token '<'”异常的原因,通常是由于HTML和JS代码混合导致造成的,只要将它们分离开来按照各自的语法规则编写,就可以成功避免这种问题的发生了。 ### 回答3: 这是一个程序出错的提示信息。首先,ntaxerror表示语法错误;unexpected token '<'表示代码中出现了一个意外的‘<’符号;at new function (<anonymous>) at runcode2fun是错误提示的位置信息,指出该错误发生在程序的哪一行。 可能的原因是,在代码某个部分中,程序尝试使用‘<’符号,但是用法却不正确,导致编译器无法识别,从而产生了语法错误。可能需要检查代码,找出出现‘<’符号的位置,并检查和纠正与之相关的语法错误。 此外,at new function (<anonymous>) at runcode2fun提示了错误位置信息,可以协助开发者更轻松地确定错误所在,从而更加迅速地找到错误并进行修正。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值