```cpp
if(a>0&&b>0&&c>0&&d[a][b][c]){
output=d[a][b][c];
}
```
这里,如果 $a,b,c$ 远远大于 $20$,数组就会越界,导致 RE。
将
```cpp
else if(a>20||b>20||c>20){
return w(20,20,20);
}
```
移至最前面即可。
by _caiji_ @ 2021-07-24 09:20:31
@[caijianhong](/user/390033) 谢谢大佬,但是#1和#5 WA了
by ajahjahah @ 2021-07-24 09:26:45
```cpp
#include<bits/stdc++.h>
using namespace std;
long long a,b,c,d[25][25][25];
long long w(long long a,long long b,long long c){
long long output;
if(a>20||b>20||c>20){
return w(20,20,20);
}
else if(a>0&&b>0&&c>0&&d[a][b][c]){
output=d[a][b][c];
}
else if(a<=0||b<=0||c<=0){
output=1;
}
else if(a<b&&b<c){
output=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
}
else{
output=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(a>0&&b>0&&c>0){
d[a][b][c]=output;
}
return output;
}
int main(){
while(cin>>a>>b>>c){
if(a==-1&&b==-1&&c==-1){
break;
}
printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,w(a,b,c));
}
return 0;
}
```
这是我的代码
by ajahjahah @ 2021-07-24 09:27:15
@[李嘉昇](/user/357378) 读题。
>absi2011 : 比如 $w(30,−1,0)$ 既满足条件 $1$ 又满足条件 $2$
这种时候我们就按最上面的条件来算
所以答案为 $1$
先判断 $\leq 0$,再判断 $>20$,顺序错了。
by _caiji_ @ 2021-07-24 09:57:43
@[caijianhong](/user/390033)
谢谢大佬,AC了
大佬NB!
by ajahjahah @ 2021-07-24 10:00:43