牛客编程巅峰赛S1第11场 - 黄金&钻石 B.新集合 (DFS)

-
题意:有\([1,n]\)这\(n\)个数,构造集合,集合中不能包含\(u\)和\(v\),问最多能构造多少个集合.
-
题解:被这题卡了一整场.....以为是推公式,结果答案是暴搜?
首先我们先用一个二维数组标记一下所有\(u\)和\(v\),然后从\(1\)开始搜,如果\(num>k\)就表示一种情况搜完了,首先考虑不选,深搜,然后再判断标记情况和小于\(num\)的数是否被选过,如果不满足就返回上一层,否则选当前这个数,标记,深搜,回溯即可.
-
代码:
/** * struct Point { * int x; * int y; * }; */ class Solution { public: /** * 返回新集合的种类数 * @param n int整型 集合大小 * @param m int整型 限制数量 * @param limit Point类vector 不能同时出现的(u,v)集合 * @return int整型 */ bool st[1000][1000]; bool vis[1000010]; int ans=0; void dfs(int num,int n){ if(num>n){ ans++; return; } dfs(num+1,n); for(int i=1;i<num;++i){ if(vis[i] && st[i][num]) return; } vis[num]=true; dfs(num+1,n); vis[num]=false; return; } int solve(int n, int m, vector<Point>& limit) { // write code here for(int i=0;i<m;++i){ st[limit[i].x][limit[i].y]=true; st[limit[i].y][limit[i].x]=true; } dfs(1,n); return ans; } };
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号