警示后人:如果你第六个点TLE
查看原帖
警示后人:如果你第六个点TLE
477258
charleshe楼主2023/1/29 10:27

检查一下你的双向搜索是不是这么写的:

void dfs1(int x,int num){
    if(x==n/2+1) return;
    for(......){
        dfs1(x+1,num*_);
    }
}
void dfs2(int x,int num){
    if(x==n+1) return;
    for(......){
        dfs2(x+1,num*_);
    }
}

如果是,那么请改成这样:

void dfs1(int x,int num){
    if(x>n) return;
    for(......){
        dfs1(x+2,num*_);
    }
}
void dfs2(int x,int num){
    if(x>n) return;
    for(......){
        dfs2(x+2,num*_);
    }
}

具体原因:如果使用前者,会导致前半部分和后半部分的状态数相差几十倍,从而导致搜索没有被很好的优化;而后者则可以解决这个问题,不过需要记得在输入 p 数组后排一下序。

2023/1/29 10:27
加载中...