《七月集训》第三十一天 状态压缩

Crazy_DM 2022-07-31 16:11:37

526.优美的排列

class Solution {
public:
    int countArrangement(int n) {
        vector<int> dp(1 << n);
        dp[0] = 1;
        for(int mask = 1; mask < (1 << n); ++mask) {
            int num = __builtin_popcount(mask); //代表当前序列的长度
            for(int i = 0; i < n; ++i) {//寻找mask适合的位置
                if(mask & (1 << i) && (num % (i + 1) == 0 || (i + 1) % num == 0)) {
                    dp[mask] += dp[mask ^ (1 << i)]; // mask^(1<<i) 表示第mask^(1<<i)是空缺的且num能够放进去,加上这种方案数
                    //cout << dp[mask] << endl;
                }
            }
        }
        return dp[(1<<n) - 1];
    }
};

 

...全文
27 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
万人千题

6.2w+

社区成员

学习「 算法 」的捷径就是 「 题海战略 」,社区由「 夜深人静写算法 」作者创建,三年ACM经验,校集训队队长,亚洲区域赛金牌,世界总决赛选手。社区提供系统的训练,答疑解惑,面试经验,大厂内推等机会
社区管理员
  • 英雄哪里出来
  • Amy卜bo皮
  • Risso
加入社区
帖子事件
创建了帖子
2022-07-31 16:11
社区公告

QQ群:480072171

英雄算法交流 8 群