64,172
社区成员




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];
}
};