64 条题解

  • 0
    @ 2023-8-4 21:36:43

    很简单: 我先列一下注意点: 1.此题变量a,b,c与函数w均超过int储存范围,用long long刚刚好 2.因为递归调用次数过多会导致TLE,用记忆化搜索就行了,讲一下f的范围,开三维f[15][15][15]就行了;因为大于10返回w(10,10,10)限制了范围,不然会MLE 3.按情况优先级来考虑代码优先级 4.递归公式和边界自己推吧,题上都有

    上代码!!!

    #include <cstdio>
    using namespace std;
    long long a,b,c,f[15][15][15];
    long long w(long long a,long long b,long long c){
        if(a<=0||b<=0||c<=0)return 1;//第一种情况
        if(a>10||b>10||c>10)return w(10,10,10);//第二种情况
        if(!f[a][b][c])a<b&&b<c?f[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c):f[a][b][c]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);//三目运算,!f[a][b][c]是判断此函数值有没有记录,因为全局默认memset
        return f[a][b][c];//返回此函数值
    }
    int main(){
        scanf("%ld%ld%ld",&a,&b,&c);
        printf("w(%ld,%ld,%ld)=%ld\n",a,b,c,w(a,b,c));
        return 0;
    }
    

    格式化一下:

    #include <iostream>
    using namespace std;
    long long a,b,c,f[15][15][15];
    long long w(long long a,long long b,long long c)
    {
        if(a<=0||b<=0||c<=0)//第一种情况
        {
             return 1;
        }
        if(a>10||b>10||c>10)//第二种情况
        {
            return w(10,10,10);
        }
        if(!f[a][b][c])//判断函数记录是否为空
        {
            if(a<b&&b<c)//第三种情况
            {
                f[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
            }
            else//第四种情况
            {
                f[a][b][c]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
            }
        return f[a][b][c];//返回函数记录
    }
    int main(){
        cin>>a>>b>>c;
        cout<<"w("<<a<<","<<b<<","<<c<<")="<<w(a,b,c)<<endl;
        return 0;
    }
    

    科普一下: 1.cstdio是在保留小数中需要用到的库,还可以用iomanip来调用setprecision,只是太长了,不推荐各位做 为大家列张表:

    类型 int long long float double char string bool
    对应调用符号 %d %ld %f %lf %c %s 忘了,大家可以查一查

    不知道为什么用%s会报错 2.三目运算 操作如下: (bool表达式)?为真操作语句:为假操作语句; 就是if...else 有趣的是,它有返回值,return用三目只能用返回值,否则会报错 题解不易,点赞抱走

    • 0
      @ 2023-8-4 16:06:04
      #include<bits/stdc++.h>
      using namespace std;
      long long x , y , z;
      long long w(int a,int b,int c)
      {
      	if (a <= 0 || b <= 0 || c <= 0)
      	{
      		return 1;
      	}
      	else if (a > 10 || b > 10 || c > 10)
      	{
      		return w(10,10,10);
      	}
      	else if (a > b && b > c)
      	{
      		return w(a,b,c - 1) + w(a,b - 1,c - 1) - w(a,b - 1,c);
      	}
      	else
      	{
      		return w(a - 1,b,c) + w(a - 1,b - 1,c) + w(a - 1,b,c - 1) - w(a - 1,b - 1,c - 1);
      	}
      }
      int main()
      {
          cin >> x >> y >> z;
          cout << "w(" << x << "," << y << "," << z << ")=" << w(x , y , z) << endl;
      }
      
      
      • 0
        @ 2023-8-3 21:42:41

        ``//灰常简单对吧```

        #include<bits/stdc++.h>//题解由hetao1098709提供
        using namespace std;
        long long a,b,c;
        long long zhenwuyu(long long a,long long b,long long c)
        {
        if (a<=0||b<=0||c<=0)
        {
        return 1;
        }
        else if(a>10 ||b>10||c>10)
        {
        return zhenwuyu(10,10,10);
        }
        else if(a<b&&b<c)
        {
        return zhenwuyu(a,b,c-1)+zhenwuyu(a,b-1,c-1)-zhenwuyu(a,b-1,c);
        }
        else
        {
        return zhenwuyu(a-1,b,c)+zhenwuyu(a-1,b-1,c)+zhenwuyu(a-1,b,c-1)-zhenwuyu(a-1,b-1,c-1);
        }
        }
        int main()
        {
        cin>>a>>b>>c;
        cout<<"w("<<a<<","<<b<<","<<c<<")="<<zhenwuyu(a,b,c);
        }
        
        
        
        • @ 2023-8-3 21:43:54

          一定要开long long 所有都要开,不然只能90%通过

      • 0
        @ 2023-8-3 20:29:09

        image

        这是定义函数的代码👆🏼

        🔴注意:在定义输入变量时一定一定注意是

        longlong的数据类型哦

        加油😊

        • 0
          @ 2023-8-3 18:40:24

          100 Accepted

          # 状态分数 耗时 内存占用
          ---------------------------------------
          #1 Accepted10 775ms 376 KiB
          -
          #2 Accepted10 1ms 380 KiB
          #3 376 KiB
          #4
          #5
          #6
          #7
          #8 8ms
          #9 74ms
          #10 772ms

          代码

          yiyiyiyiyiyiyiyiyiyiyiyi~~~我找了半天算法,结果一无所获,枚举竟然满分了!!!

          吐槽数据

          #include <bits/stdc++.h>
          using namespace std;
          long long w(long long a,long long b,long long c)
          {
              if (a <= 0 || b <= 0 || c <= 0) return 1;
              if (a > 10 || b > 10 || c > 10) return w(10,10,10);
              if (a < b && b < c) return w(a,b,c - 1) + w(a,b - 1,c - 1) - w(a,b - 1,c);
              return w(a - 1,b,c) + w(a - 1,b - 1,c) + w(a - 1,b,c - 1) - w(a - 1,b - 1,c - 1);
          }
          int main()
          {
              long long x,y,z;
              cin >> x >> y >> z;
              cout << "w(" << x << "," << y << "," << z << ")=" << w(x,y,z);
          }
          
          • 0
            @ 2023-7-31 20:37:52

            yasuo告诉您,递归考察0%,运算符考察1%,复制能力考查99%👀️

            #include <iostream>
            double w(long long a,long long b,long long c){
                if(a<=0||b<=0||c<=0) return 1;
                if(a>10||b>10||c>10) return w(10,10,10);
                if(a<b&&b<c) return w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
                return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);}
            int main(){
                long long a,b,c;std::cin>>a>>b>>c;
                std::cout<<"w("<<a<<","<<b<<","<<c<<")="<<w(a,b,c);return 0;}
            
            • 0
              @ 2023-7-24 23:47:31

              -题目回顾-

              1. a <= 0 || b <= 0 || c<=0 返回1
              2. a > 10 || b > 10 || c > 10返回w(10, 10, 10)
              3. a < b && b < c返回w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c)
              4. 其他情况一律返回w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1)

              其实这里题目说的就十分明白了,就是要用if-else if-else语句!接下来的递归程序就按照题目给的填进去即可!


              代码如下,点赞拿走

              #include <bits/stdc++.h>
              using namespace std;
              int w(int a, int b, int c)
              {
              if(a <= 0 || b <= 0 || c <= 0)
              return 1;
              else if(a > 10 || b > 10 || c > 10)
              return w(10, 10, 10);
              else if(a < b && b < c)
              return w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
              else
              return w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
              }//核心部分
              long x, y, z;//一定要longlong!!!
              int main()
              {
              cin >> x >> y >> z;
              cout << "w(" << x << ',' << y << ',' << z << ")=" << w(x, y, z);
              }
              
              • 0
                @ 2023-7-24 14:39:22

                90分的血泪史

                注意long long!!!! 好了其他没什么好说了

                AC代码

                #include <bits/stdc++.h>
                using namespace std;
                long long w(long long a,long long b,long long c){
                	if(a <= 0 or b <= 0 or c <= 0){
                		return 1;
                	}else if(a > 10 or b > 10 or c > 10){
                		return w(10,10,10);
                	}else if(a < b and b < c){
                		return w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
                	}else{
                		return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
                	}
                }
                int main(){
                	long long l,n,m;
                	cin >> l >> n >> m;
                	cout << "w(" << l << ',' << n << ',' << m << ")=" << w(l,n,m);
                	return 0;
                }
                

                byebye 希望帮到和我一样卡在90的童鞋

                • 0
                  @ 2023-7-21 23:15:13

                  AC so easy

                  函数依照题干就可写出。 注意: 1,数据过大,需要用long long! 2,需要按题干给出的顺序写! 【递归代码】

                  long long w(long long a,long long b,long long c)//hetao1306277
                  {
                      if (a <= 0 || b <= 0 || c <= 0)
                      {
                          return 1;
                      }
                      else if (a > 10 || b > 10 || c > 10)
                      {
                          return w(10,10,10);
                      }
                      else if (a < b && b < c)
                      {
                          return w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
                      }
                      else
                      {
                          return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-       1)-w(a-1,b-1,c-1);
                      }
                  }
                  

                  解题不易😕 点赞走起🚀️

                  无毒无害👀️ 放心“食”用😄

                  记得点赞后再“食”用哦❤️

                  • 0
                    @ 2023-7-8 15:19:14

                    我喜小喵又回来了!

                    这题其实就是按题目编码,我们一句一句翻译

                    如果 a<=0 或 b<=0 或 c<=0 ,返回1

                    if(a<=0 || b<=0 || c<=0) return 1;
                    

                    如果 ​a>10 或 ​b>10 或 ​c​>10 就返回 ​w(​10,​10,​10​)

                    else if (a>10 || b>10 || c>10) return w(10,10,10);
                    

                    如果 ​a​<b 并且 ​b​<c 就返回​w(​a,​b​,​c−​1​)​+​​w​(​a​,​b​−1,​c​−​1​)−​w(​a​,​b−​1,​c​)

                    else if(a < b && b < c) return w(a,b,c - 1) + w(a,b - 1,c - 1) - w(a,b - 1,c);
                    

                    其它的情况就返回 ​w​(​a​−​1,​b​,​c​)+​​w​(​a​−1,​b−​1,​c​)+​​w​(​a​−1,​b,​c−​1​)​−​w(​a​−​1​,​b​−​1​,​c​−​1​)

                    else return w(a - 1,b,c) + w(a - 1,b - 1,c)+w(a - 1,b,c - 1)-w(a - 1,b - 1,c - 1);
                    

                    最后提醒一下:开long long!!!

                    记得点赞!

                    不要直接拿走,自己思考一下。

                    如有错误,请在评论区留言,晚辈随时更正~

                    • 0
                      @ 2023-6-22 10:52:30

                      为了防止TLE,用备忘录(记忆化搜索🔍) 废话不多说 上代码

                      #include <iostream>
                      using namespace std;
                      long long  a, b, c, f[25][25][25];//备忘录(f)防止TLE
                      long long w(long long  a, long long b, long long c){
                      

                      一定要用long long(-(2^63)<long long <2^63

                      if (a<=0 || b<=0 || c<=0)return 1;
                      else if (a>10 || b>10 || c>10){
                          return w(10,10,10);
                      }else if (f[a][b][c]){
                          return f[a][b][c];
                      }else if(a<b && b<c){
                          f[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
                          return f[a][b][c];
                      }else{
                          f[a][b][c]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
                          return f[a][b][c];
                      }//判断四种情况
                      

                      函数定义+记忆化搜索🔍

                      }
                      int main()
                      {
                      cin >> a >> b >> c;
                      cout <<"w(" << a << ',' << b <<',' <<c <<")=" << w(a,b,c);//也可用printf
                      return 0;
                      

                      已AC,可以参考核桃L7-6练习8的代码

                      • @ 2024-4-13 22:51:11

                        在你编完后,你会发现根本不用记忆化就够了

                    • 0
                      @ 2023-6-18 8:13:25

                      绝对Accepted

                      #include<iostream>
                      using namespace std;
                      //要开long long
                      int w(long long a,long long b,long long c)
                      {
                          if(a<=0 or b<=0 or c<=0)
                          {
                              return 1;
                          }
                          if(a>10 or b>10 or c>10)
                          {
                              return w(10,10,10);
                          }
                          if(a<b and b<c)
                          {
                              return w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
                          }
                          return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
                      }
                      int main()
                      {
                          //要开long long
                          long long a,b,c;
                          cin>>a>>b>>c;
                          cout<<"w("<<a<<","<<b<<","<<c<<")="<<w(a,b,c);
                          return 0;
                      }
                      
                      • 0
                        @ 2023-6-17 18:53:00

                        2处易错点:

                        1. 数据类型为long int
                        2. 输出并非仅输出结果

                        递归函数伪代码:

                        long int w(long int a,long int b,long int c){
                            如果(a<=0 或 b<=0 或 c<=0){
                                返回 1;
                            }否则如果(a>10 或 b>10 或 c>10){
                                返回 w(10,10,10);
                            }否则如果(a<b 且 b<c){
                                返回 w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
                            }否则{
                                返回 w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
                            }
                        }
                        
                        • 0
                          @ 2023-5-28 12:31:51

                          #include<bits/stdc++.h> using namespace std; long m,n,o; int w(long a,long b,long c) { if(a<=0||b<=0||c<=0) return 1; if(a>=10||b>=10||c>=10) return w(10,10,10); if(a<b&&b<c) return w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c); else return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1); } int main() { cin>>m>>n>>o; cout<<"w("<<m<<','<<n<<','<<o<<")="<<w(m,n,o); return 0; }

                          • 0
                            @ 2023-5-14 11:55:27
                            '''
                            #include<bits/stdc++.h>
                            using namespace std;
                            long long a,b,c;
                            long long w(long long a,long long b,long long c){
                                if(a<=0||b<=0||c<=0){
                                    return 1;
                                }
                                if(a>10||b>10||c>10){
                                    return w(10,10,10);
                                }
                                if(a<b&&b<c){
                                    return w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
                                }
                                return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
                            }
                            int main(){
                                cin>>a>>b>>c;
                                cout<<"w("<<a<<","<<b<<","<<c<<")="<<w(a,b,c);
                                return 0;
                            }
                            
                            • 0
                              @ 2023-5-13 22:14:40

                              代码如下(思路直接看题目,略):

                              #include <iostream>
                              using namespace std;
                              long long w(long long a,long long b,long long c)
                              {
                              	long long ans;
                              	if((a<=0)or(b<=0)or(c<=0)) 
                              	{
                              		return 1;
                              	}
                              	else if((a>10)or(b>10)or(c>10))
                              	{
                              		ans=w(10,10,10);
                              		return ans;
                              	}
                              	else if ((a<b)and(b<c))
                              	{
                              		ans=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
                              		return ans;
                              	}
                              	else
                              	{
                              		ans= w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
                              		return ans;
                              	}
                              }
                              int main()
                              {
                              	long long a,b,c;
                                  cin>>a>>b>>c;
                                  cout<<"w(" << a << "," << b << "," << c << ")=" << w(a,b,c);
                              }
                              
                              • 0
                                @ 2023-5-13 22:02:25

                                这是一个递归函数,根据输入的三个参数a、b、c,计算出w(a,b,c)的值。

                                值得注意的是这一次的数据很大,需要使用long long类型数值

                                函数w(a,b,c)根据题目描述进行以下判断和计算:

                                1. 如果a <= 0或b <= 0或c <= 0,返回值1;
                                2. 如果a > 10或b > 10或c > 10,返回w(10,10,10);
                                3. 如果a < b并且b < c,返回w(a,b,c - 1) + w(a,b - 1,c - 1) - w(a,b - 1,c);
                                4. 其它情况,返回w(a - 1,b,c) + w(a - 1,b - 1,c) + w(a - 1,b,c - 1) - w(a - 1,b - 1,c - 1)。

                                其中,条件3和条件4也是递归调用w函数,分别计算了w(a,b,c-1)、w(a,b-1,c-1)、w(a,b-1,c)和w(a-1,b,c)、w(a-1,b-1,c)、w(a-1,b,c-1)、w(a-1,b-1,c-1)的值。

                                最后,main函数中通过cin输入a、b、c的值,然后调用w函数计算w(a,b,c)的值,再输出结果。

                                需要注意的是,如果输入的参数中有一个小于0,则会先满足条件1,返回值1,不会继续满足条件2,返回w(10,10,10)。


                                代码如下:

                                #include <iostream>
                                using namespace std;
                                long long w(long long a,long long b,long long c)
                                {
                                    if(a <= 0 || b <= 0 || c <= 0)
                                    {
                                        return 1;
                                    }
                                    else if(a > 10 || b > 10 || c > 10)
                                    {
                                        return w(10,10,10);
                                    }
                                    else if(a < b && b < c)
                                    {
                                        return w(a,b,c - 1) + w(a,b - 1,c - 1) - w(a,b - 1,c);
                                    }
                                    else
                                    {
                                        return w(a - 1,b,c) + w(a - 1,b - 1,c)+w(a - 1,b,c - 1)-w(a - 1,b - 1,c - 1);
                                    }
                                }
                                int main()
                                {
                                    long long a,b,c;
                                    cin >> a >> b >> c;
                                    cout << "w(" << a << "," << b << "," << c << ")=" << w(a,b,c) << endl;
                                    return 0;
                                }
                                
                                • 0
                                  @ 2023-5-13 21:28:01

                                  首先根据题目要求,我们

                                  写出函数

                                  long long w(long long a,long long b,long long c){
                                      if(a<=0||b<=0||c<=0)return 1;
                                      if(a>10||b>10||c>10)return w(10,10,10);
                                      if(a<b&&b<c)return w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
                                      return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
                                  }
                                  

                                  这里之所以要用long long类型呢,是因为

                                  不用long long类型会数据溢出!!!

                                  题目给的数值范围是骗人的:(

                                  接下来在main()函数中,依题意可以使用

                                  <stdio.h>

                                  进行格式化输入输出 由于使用了long long类型,格式化符要作出些许改变

                                  代码如下

                                  #include<stdio.h>
                                  int main(){
                                      long long a,b,c;
                                      scanf("%lld%lld%lld",&a,&b,&c);
                                      printf("w(%lld,%lld,%lld)=%lld",a,b,c,w(a,b,c));
                                      return 0;
                                  }
                                  

                                  综合来看,这道题还是很简单的,只不过

                                  敲递归代码和long long比较烦人:(

                                  • 0
                                    @ 2023-3-4 19:21:50
                                    #include <bits/stdc++.h>
                                    using namespace std;
                                    long long w(long long a, long long b, long long c){
                                        if ((a <= 0) || (b <= 0) || (c <= 0)) return 1;
                                        if ((a > 10) || (b > 10) || (c > 10)) return w(10, 10, 10);
                                        if ((a < b) && (b < c)) return w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
                                        return w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
                                    }
                                    int main(){
                                        long long a, b, c; cin >> a >> b >> c; cout << "w(" << a << "," << b << "," << c << ")=" << w(a, b, c);
                                        return 0;
                                    }
                                    

                                    熟悉的棍子战术 人坤题目,没啥好说的!!!

                                    • @ 2023-3-4 19:22:44

                                      还有, 用int不够, 要longlonglong才行

                                    • @ 2023-5-13 21:30:26

                                      下次可以适当换行和删减空格,使代码可以

                                      在一行内完整显示

                                      而不是还要左右拖看全代码

                                    • @ 2023-5-13 21:31:29

                                      同时可以在三个`后面加上cpp,高亮c++关键字

                                  • 0
                                    @ 2023-3-2 21:09:18

                                    唔...... 感觉蛮简单得嘛👀️ 👀️ 👀️

                                    #include <bits/stdc++.h>//Bob8****76
                                    using namespace std;
                                    long long a, b, c;
                                    long long w(long long a, long long b, long long c)
                                    {
                                        if (a <= 0 || b <= 0 || c <= 0)
                                        {
                                            return 1;
                                        }
                                        else if (a > 10 || b > 10 || c > 10)
                                        {
                                            return w(10, 10, 10);
                                        }
                                        else if (a < b && b < c)
                                        {
                                            return w(a, b , c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
                                        }
                                        else
                                        {
                                            return w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
                                        }
                                    }
                                    int main()
                                    {
                                        cin >> a >> b >> c;
                                        cout << "w(" << a << "," << b << "," << c << ")=" << w(a, b, c); 
                                        return 0;
                                    }
                                    

                                    嗨嗨嗨🚀️

                                    信息

                                    ID
                                    7
                                    时间
                                    2000ms
                                    内存
                                    256MiB
                                    难度
                                    7
                                    标签
                                    递交数
                                    9573
                                    已通过
                                    2181
                                    上传者