C++ 在涉及的递归调用中到底发生了什么?

C++ 在涉及的递归调用中到底发生了什么?,c++,algorithm,recursion,dynamic-programming,C++,Algorithm,Recursion,Dynamic Programming,因此,我试图解决以下问题: 规则方括号序列是一个字符串,仅由开始方括号和结束方括号组成,并满足以下条件: •空字符串是一个常规的括号序列 •如果A是正则括号0序列,那么(A),[A]和{A}也是正则括号序列 •如果A和B是常规括号序列,则AB也是常规括号序列 例如,序列[({})],{}i{}[{}]是规则的,但是序列[({([,}和[{}])([{}]不是规则的 Ivica发现了一个字符串,它看起来可能是一个规则的括号序列。一些字符已经变得污迹斑斑,难以辨认,可能是任何字符 编写一个程序,计算

因此,我试图解决以下问题:

规则方括号序列是一个字符串,仅由开始方括号和结束方括号组成,并满足以下条件:

•空字符串是一个常规的括号序列

•如果A是正则括号0序列,那么(A),[A]和{A}也是正则括号序列

•如果A和B是常规括号序列,则AB也是常规括号序列

例如,序列[({})],{}i{}[{}]是规则的,但是序列[({([,}和[{}])([{}]不是规则的

Ivica发现了一个字符串,它看起来可能是一个规则的括号序列。一些字符已经变得污迹斑斑,难以辨认,可能是任何字符

编写一个程序,计算字符串中难以辨认的字符可以用括号替换多少种方式,从而得到一个规则的括号序列。这个数字可能非常大,因此只输出最后5位数字

输入


第一行包含一个偶数整数N(2基本上,答案是将任何开括号+闭括号对的所有有效组合相乘。冗长的if语句是递归函数的停止条件,因为任何对都可以有0、1或3个有效组合。实际上,将您抛出的递归调用是(结合for循环)扫描整个字符串以查找括号对。如果说字符串是对称的,那么它将是一个更简单的调用:
fun(左+1,右-1)你也知道C和C++中有一个声明吗?@ DeCytTyAuto,为什么你要问这里的开关/情况?可以用另一种方式重写这个代码(用<代码>开关< /代码>),但这无助于哈利理解这段代码的逻辑。@decltype_auto,恕我冒犯,但如果你不再向别人炫耀你的学识,而是帮助我,那将对我有很大帮助。正是因为像你这样的人,很多初学者往往因为你试图展示你令人难以置信的幽默而无法学习“我,一点也不令人惊讶。”@decltype_auto,我是,但是,不要说那些对任何人都没有帮助的话,你应该让你的答案(这对OP有帮助)做我感觉到的对话。与其说它有助于可读性,不如写一个能提高可读性的答案。如果答案是这样的话,我很乐意接受你的答案。@decltype_auto,哦,我的上帝。这太神奇了。你自己建议代码需要重新构造,而现在你自己说这不是代码编写服务。至少看看我问的问题。我从来没有要求你为我编写代码。我只是要求你帮助我理解逻辑。至少要记住一件事。func(左+1,I-1)具体代表什么?我想func(I+1,右)这基本上意味着,我们在为下一个位置做这个。还有,为什么我们要将i增加2个单位?为什么不只是1?
func(左+1,i-1)
是从左边开始的子字符串,另一个是从右边结束的子字符串。它们只在整个字符串中重叠。实际上,我认为更好的措辞应该是一个将?chars视为开始括号,另一个视为结束括号。我希望我没有弄错。
#include<iostream>
#include<list>
#include<string>
#include<cstring>
#include<sstream>
#include<cctype>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<stack>
#include<fstream>
#include<cstdlib>
#include<vector>
#include<map>
#include<utility>
#include<iomanip>
#include<queue>

using namespace std;

#define INF (1<<29)
#define SET(a) memset(a,-1,sizeof(a))
#define ALL(a) a.begin(),a.end()
#define CLR(a) memset(a,0,sizeof(a))
#define FILL(a,v) memset(a,v,sizeof(a))
#define PB push_back
#define FOR(i,n) for(int i = 0;i<n;i++)
#define PI acos(-1.0)
#define EPS 1e-9
#define MP(a,b) make_pair(a,b)
#define READ(f) freopen(f, "r", stdin)
#define WRITE(f) freopen(f, "w", stdout)
#define LL long long
#define MOD 100000

bool moduloUsed;
LL memo[200+10][200+10];
string s;

LL func(int left, int right)
{
    int i, valid;
    if(left>right)  return 1;

    if(memo[left][right]!=-1)   return memo[left][right];

    LL ret=0;

    for(i=left+1;i<=right;i+=2)
    {
        if(s[left]=='(' && s[i]==')') valid=1;
        else if(s[left]=='{' && s[i]=='}') valid=1;
        else if(s[left]=='[' && s[i]==']') valid=1;
        else if(s[left]=='?' && s[i]==')') valid=1;
        else if(s[left]=='?' && s[i]=='}') valid=1;
        else if(s[left]=='?' && s[i]==']') valid=1;
        else if(s[left]=='(' && s[i]=='?') valid=1;
        else if(s[left]=='{' && s[i]=='?') valid=1;
        else if(s[left]=='[' && s[i]=='?') valid=1;
        else if(s[left]=='?' && s[i]=='?') valid=3;
        else    valid=0;

        ret+=valid*func(left+1,i-1)*func(i+1,right);

        if(ret>MOD)
        {
            moduloUsed=true;
            ret%=MOD;
        }
    }
return memo[left][right]=ret;
}


int main()
{
    LL ans,length;

    while(cin>>length>>s)
    {
        SET(memo);
        ans=func(0,length-1);
        if(!moduloUsed)
        cout<<ans<<endl;
        else
        printf("%05lld\n",ans);
    }

return 0;
}