995 蒟蒻全RE!!!

P1464 Function

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 最先判断那些不合法的情况,比如说 < 0 \geq 20 的情况,然后再处理储存在了数组里面的情况。

这样可以有效排除数组没开够的情况导致的RE。


by INT_1024 @ 2022-09-27 11:58:10

@南阳刘子骥 @sherry0218 谢谢,懂了!


|