64 条题解
-
0
很简单: 我先列一下注意点: 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
#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
``//灰常简单对吧```
#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); }
-
0
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
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
-题目回顾-
- 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)
其实这里题目说的就十分明白了,就是要用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
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
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
我喜小喵又回来了!
这题其实就是按题目编码,我们一句一句翻译
如果 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
为了防止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的代码
-
0
绝对
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
2处易错点:
- 数据类型为long int
- 输出并非仅输出结果
递归函数伪代码:
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
#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
''' #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
代码如下(思路直接看题目,略):
#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
这是一个递归函数,根据输入的三个参数a、b、c,计算出w(a,b,c)的值。
值得注意的是这一次的数据很大,需要使用long long类型数值
函数w(a,b,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)。
其中,条件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
首先根据题目要求,我们
写出函数
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
#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; }
熟悉的棍子战术 人坤题目,没啥好说的!!!
-
0
唔...... 感觉蛮简单得嘛👀️ 👀️ 👀️
#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
- 上传者