Leetcode 526. 优美的排列 DFS/状态压缩

news/2024/7/20 22:44:51 标签: 深度优先, leetcode, 算法, c++

原题链接:Leetcode 526. 优美的排列
在这里插入图片描述
DFS:

class Solution {
public:
    vector<vector<int>> match;
    vector<int> vis;
    int res=0;
    void dfs(int i,int n)
    {
        if(i==n+1)
        {
            res++;
            return;
        }
        for(auto x:match[i])
        {
            if(!vis[x])
            {
                vis[x]=1;
                dfs(i+1,n);
                vis[x]=0;
            }
        }
    }
    int countArrangement(int n) {
        match.resize(n+1);
        vis.resize(n+1);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i%j==0 || j%i==0)
                {
                    match[i].push_back(j);
                }
            }
        }   
        dfs(1,n);
        return res;
    }
};

状态压缩:【宫水三叶】详解两种状态压缩 DP 思路

class Solution {
public:
    int countArrangement(int n) {
        int mask=1<<n;
        vector<vector<int>> f(n+1,vector<int>(mask));
        f[0][0]=1;
        for(int i=1;i<=n;i++)
        {    // 枚举所有的状态
            for(int state=0;state<mask;state++)
            {   // 枚举位置 i(最后一位)选的数值是 k
                for(int  k=1;k<=n;k++)
                {
                    // 首先 k 在 state 中必须是 1
                    if(((state>>(k-1))&1)==0) continue;
                    // 数值 k 和位置 i 之间满足任一整除关系
                    if(k%i!=0 && i%k!=0) continue;
                    // state & (~(1 << (k - 1))) 代表将 state 中数值 k 的位置置零
                    f[i][state]+=f[i-1][state&(~(1<<(k-1)))];
                }
            }
        }
        return f[n][mask-1];
    }
};



http://www.niftyadmin.cn/n/1264570.html

相关文章

Leetcode 318. 最大单词长度乘积

原题链接&#xff1a;Leetcode 318. 最大单词长度乘积 自己写的代码 哈希&#xff1a; class Solution { public:int maxProduct(vector<string>& words) {int nwords.size();int res0;vector<vector<int>> v(n,vector<int>(26));for(int i0;i&…

Leetcode 187. 重复的DNA序列 位运算

原题链接&#xff1a;Leetcode 187. 重复的DNA序列 自己写的代码 哈希&#xff1a; class Solution { public:vector<string> findRepeatedDnaSequences(string s) {int ns.size();vector<string> res;unordered_map<string,int> m;for(int i0;i<n-9;i)…

Leetcode 421. 数组中两个数的最大异或值 位运算

原题链接&#xff1a;Leetcode 421. 数组中两个数的最大异或值 这道题说实话&#xff0c;还看不太懂 参考题解&#xff1a;利用异或运算的性质、假设修正 class Solution { public:int findMaximumXOR(vector<int>& nums) {int mask0,res0;for(int i30;i>0;i--…

CCF-CSP 201809-3 元素选择器

原题链接&#xff1a;CCF-CSP 201809-3 元素选择器 参考题解&#xff1a;CCF201809-3 元素选择器&#xff08;100分&#xff09;【文本处理】 #include <bits/stdc.h> using namespace std; const int N110; struct node {string name;string id;int len; }h[N];int mai…

Leetcode 523. 连续的子数组和 前缀和

原题链接&#xff1a;Leetcode 523. 连续的子数组和 参考链接&#xff1a;【宫水三叶】拓展到求方案数问题 class Solution { public:bool checkSubarraySum(vector<int>& nums, int k) {int nnums.size();vector<int> sum(n1,0);for(int i1;i<n;i) sum…

Leetcode 525. 连续数组 前缀和+哈希

原题链接&#xff1a;Leetcode 525. 连续数组 参考题解&#xff1a;525.连续数组 前缀和哈希表 速解&#xff01; class Solution { public:int findMaxLength(vector<int>& nums) {int nnums.size();unordered_map<int,int> mp;mp[0]-1;int res0,cur0;for(i…

Leetcode 1371. 每个元音包含偶数次的最长子字符串 异或+前缀和

原题链接&#xff1a;Leetcode 1371. 每个元音包含偶数次的最长子字符串 参考题解&#xff1a;Leetcode 1371. 每个元音包含偶数次的最长子字符串 class Solution { public:int findTheLongestSubstring(string s) {vector<int> v(1<<5,INT_MAX);v[0]-1;int state…

Leetcode 1310. 子数组异或查询 前缀和+异或

原题链接&#xff1a;Leetcode 1310. 子数组异或查询 主要思想就是a ^ b ^ba class Solution { public:vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {int narr.size();vector<int> sum(n1,0);for(int …