hiho一下第220周《Push Button I》题目分析

12
0

《Push Button I》题目分析

本题的数据范围只有N <= 8,又要求输出所有的解。比较容易想到就是穷举/暴搜。

不过我们仍应该先估计一下解的数量的上界。考虑每种表示法都是一个1~N的排列中插入若干个减号,所以解的数量不超过N! * 2^(N-1)。当N=8时大约是5000000,完全可以承受。

具体DFS的方法有很多种。其中一种做法是每次决策(1)选一个比当前组最后一个数更大的数加入当前组(避免组内123和321重复),(2)新建一个组。

1 answer(s)

1

请问下如何解决这段代码的超时问题?(..

#include <set>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int N=10;
bool vis[N];
set <string> ans;

void dfs(int u,int n,int cnt,string s){
    if(cnt==n){
        ans.insert(s);
        return ;
    }
    for(int i=1;i<=n;i++){
        if(vis[i]) continue;
        char c=i+'0';
        vis[i]=true;
        if(i>u) dfs(i,n,cnt+1,(s+c));
        vis[i]=false;
        if(s[s.size()-1]!='-'){
            dfs(-1,n,cnt,(s+"-"));
        }
    }
}

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        vis[i]=true;
        char c=(i+'0');
        string s="";
        dfs(i,n,1,s+c);
        vis[i]=false;
    }
    cout<<ans.size()<<endl;
    set <string> ::iterator it;
    for(it=ans.begin();it!=ans.end();it++)
    cout<<*it<<endl;
    return 0;
}
  • set太耗时呢 ,最后一组数据过不去。修改一下搜索姿势,不需要去重,排序。

  • 好的,谢谢

  • 添加评论
  • reply

write answer 切换为英文 切换为中文


转发分享