爆零!

P1464 Function

Doors_Cross @ 2024-02-16 09:13:46

#include<iostream>
typedef long long L;
int a[100005],b[100005],c[100005];
using namespace std;
L w(L a,L b,L c)
{
    if((a<=0 || b<=0 || c<=0) || ((a<=0 || b<=0 || c<=0) && (a<b && b<c)))
    {
        return 1;
    }
    else if(a>20 || b>20 || c>20)
    {
        return w(20,20,20);
    }
    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()
{
    int i=0,l=-1;
    while(true)
    {
        cin>>a[i]>>b[i]>>c[i];
        if(a[i]==-1 && b[i]==-1 && c[i]==-1)
        {
            break;
        }
        i++;
    }
    for(int j=0;j<i;j++)
    {
        cout<<"w("<<a[j]<<", "<<b[j]<<", "<<c[j]<<") = "<<w(a[j],b[j],c[j])<<endl;
    }
}

求助!RE+TLE!


by _Haoomff_ @ 2024-02-16 09:33:02

@Doors_Cross 这题要用记忆化,不然TLE。a,b,c要开long long,自己去看数据规模与约定


by liqiu_ @ 2024-02-16 09:33:40

输入的数也开 long long,可以试试。TLE 是因为你没有用记忆化搜索。


by Doors_Cross @ 2024-02-16 10:45:35

@Haoomff

#include<iostream>
typedef long long L;
L a[100005],b[100005],c[100005];
int N[25][25][25];
using namespace std;
L w(L a,L b,L c)
{
    if((a<=0 || b<=0 || c<=0) || ((a<=0 || b<=0 || c<=0) && (a>20 || b>20 || c>20)))
    {
        if(N[a][b][c]!=0)
        {
            return N[a][b][c];
        }
        else
        {
            N[a][b][c]=1;
            return N[a][b][c];
        }

    }
    else if(a>20 || b>20 || c>20)
    {
        if(N[a][b][c]==0)
        {
            N[a][b][c]=w(20,20,20);
            return N[a][b][c];
        }
        else return N[a][b][c];

    }
    else if(a<b && b<c)
    {
        if(N[a][b][c]==0)
        {
            N[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
            return N[a][b][c];
        }
        else return N[a][b][c];
    }
    else
    {
        if(N[a][b][c]==0)
        {
            N[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 N[a][b][c];
        }
        else return N[a][b][c];
    }
}
int main()
{
    int i=0,l=-1,s=1,x;
    while(true)
    {
        cin>>a[i]>>b[i]>>c[i];
        if(a[i]==-1 && b[i]==-1 && c[i]==-1)
        {
            break;
        }
        i++;
    }
    for(int j=0; j<i; j++)
    {
        if(a[j]==b[j] && b[j]==c[j])
        {
            for(int q=0; q<a[j]; q++)
            {
                s*=2;
            }
            cout<<"w("<<a[j]<<", "<<b[j]<<", "<<c[j]<<") = "<<s<<endl;
            continue;
        }
        cout<<"w("<<a[j]<<", "<<b[j]<<", "<<c[j]<<") = "<<w(a[j],b[j],c[j])<<endl;
    }
}

改了一下,RE+WA了,还是爆零


by _Haoomff_ @ 2024-02-16 10:55:55

@Doors_Cross a,b,c没必要用数组,可以边输入边输出结果


by _Haoomff_ @ 2024-02-16 10:57:11

@Doors_Cross 记忆化的时候不需要每次在一个条件内都判断一次N[a][b][c]是否有值,只需要在最前面判断一下即可


|