C 具有biginger-SETNJA的SPOJ动态规划

C 具有biginger-SETNJA的SPOJ动态规划,c,dynamic,recursion,C,Dynamic,Recursion,我试图解决以下spoj问题 我使用递归实现它,但是限制非常高,不适合无符号long。在论坛上,每个人都说要用动态规划来实现它。有人能解释一下如何使用DP来完成吗。下面是我使用递归的努力。这是正确的,但答案不适合无符号long。任何暗示都将不胜感激 #include<stdio.h> typedef unsigned long long ULLD; ULLD ans=0ull; char str[10001]; int length; void recurse(int i, ULLD

我试图解决以下spoj问题

我使用递归实现它,但是限制非常高,不适合无符号long。在论坛上,每个人都说要用动态规划来实现它。有人能解释一下如何使用DP来完成吗。下面是我使用递归的努力。这是正确的,但答案不适合无符号long。任何暗示都将不胜感激

#include<stdio.h>

typedef unsigned long long ULLD;
ULLD ans=0ull;
char str[10001];
int length;
void recurse(int i, ULLD temp)
{
    if(str[i]=='\0')
    {
        ans=ans+temp;
        return;
    }
    if(str[i]=='L') recurse(i+1,2*temp);
    else if(str[i]=='R') recurse(i+1,2*temp+1);
    else if(str[i]=='P') recurse(i+1,temp);
    else if(str[i]=='*')
    {
        recurse(i+1, 2*temp);
        recurse(i+1 , 2*temp +1);
        recurse(i+1, temp);
    }
}

int main()
{   
    scanf("%s",str);
    length=strlen(str);

    recurse(0,1);

    printf("%llu",ans);
    return 0;
} 
#包括
typedef无符号长ULLD;
ULLD ans=0ull;
char-str[10001];
整数长度;
无效递归(int i,ULLD temp)
{
如果(str[i]='\0')
{
ans=ans+温度;
返回;
}
如果(str[i]='L')递归(i+1,2*temp);
如果(str[i]='R')递归(i+1,2*temp+1);
如果(str[i]='P')递归(i+1,temp);
else if(str[i]='*')
{
递归(i+1,2*temp);
递归(i+1,2*temp+1);
递归(i+1,临时);
}
}
int main()
{   
scanf(“%s”,str);
长度=strlen(str);
递归(0,1);
printf(“%llu”,ans);
返回0;
} 

没有通配符或暂停的10000深度漫游将有10000个二进制数字的值。您能详细说明一下吗?不明白:(它实际上是100001个二进制数字,我的错。每个L或R步骤相当于在当前节点值上附加0或1,以二进制形式。10000个步骤将附加10000位。我不明白为什么我的递归是错误的?为什么我应该使用动态编程?