原题链接:526. 优美的排列 - 力扣(LeetCode)
接下来给大家展示我的代码:
class Solution {
public int countArrangement(int n) {
if (n==1) return 1;
int [][]dp=new int[n+1][1<<n];
dp[0][0]=1;
Set<Integer>[] state=new HashSet [n+1];
Arrays.setAll(state,i->new HashSet<>());
state[0].add(0);
for (int i = 1; i <=n ; i++) {
for (int j:state[i-1]) {
for (int k = 0; k < n; k++) {
if ((j>>k & 1) ==0 && ((k+1)%i==0 || i%(k+1)==0)){
int newJ=j | 1<<k;
state[i].add(newJ);
dp[i][newJ] += dp[i-1][j];
}
}
}
}
return dp[n][(1<<n)-1];
}
}