INT_1024 @ 2022-09-26 22:09:12
#include<iostream>
#include<cmath>
using namespace std;
long long cnt[20][20][20];
int w(int a,int b,int c){
if(cnt[a][b][c]!=0 && a<=20 && b<=20 && c<=20) return cnt[a][b][c];
else{
if(a<=0 || b<=0 || c<=0) cnt[a][b][c]=1;
else if(a>20 || b>20 || c>20) cnt[20][20][20]=w(20,20,20);
else if(a<b && b<c) cnt[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
else if(a==b && b==c) cnt[a][b][c]=pow(2,a);
else{
cnt[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 cnt[a][b][c];
}
int main(){
int a,b,c;
for(;;){
cin>>a>>b>>c;
if(a==-1 && b==-1 && c==-1)
break;
else
cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<w(a,b,c)<<endl;
}
return 0;
}
by 南阳刘子骥 @ 2022-09-26 22:16:46
@zhouxinhao &&
逻辑与运算符是从左往右运算的。
你这个首先运行的是访址运算,因为你数组就开了这么大,所以肯定会显示RE的。
解决方法是把数组访址放到最后一个。
顺便说一下,这道题需要开long long
。
by Powerful_25 @ 2022-09-26 22:18:57
@zhouxinhao
if(a<=0 || b<=0 || c<=0) cnt[a][b][c]=1;
访问到数组下标负数
by 南阳刘子骥 @ 2022-09-26 22:19:37
@zhouxinhao 最先判断那些不合法的情况,比如说
这样可以有效排除数组没开够的情况导致的RE。
by INT_1024 @ 2022-09-27 11:58:10
@南阳刘子骥 @sherry0218 谢谢,懂了!