8.16每日一题 526.优美的排列

526. 优美的排列

假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:

第 i 位的数字能被 i 整除
i 能被第 i 位上的数字整除
现在给定一个整数 N,请问可以构造多少个优美的排列?

说明: N < = 15 N<=15 N<=15;

思路:

这个题目有点像dfs搜全排列,但是对于每一位的数有限制条件。如果我们搜出全部的全排列在判断必然会超时。

但是我们可以先筛出满足条件的数,然后放到每一位上去。

code:

class Solution {
    
    
public:
    vector<vector<int>> ans;//存可以用的数
    vector<int> vis;//记录是否用过
    int num;//存最终答案

    void dfs(int pos,int n){
    
    
        if(pos==n+1){
    
    
            num++;
            return;
        }
        for(auto &x:ans[pos]){
    
    
            if(!vis[x]){
    
    
                vis[x]=true;
                dfs(pos+1,n);
                vis[x]=false;//恢复现场
            }
        }
    }
    int countArrangement(int n) {
    
    
        vis.resize(n+1);
        ans.resize(n+1);
        for(int i=1;i<=n;i++){
    
    
            for(int j=1;j<=n;j++){
    
    
                if(i%j==0||j%i==0){
    
    
                    ans[i].push_back(j);
                }
            }
        }
        dfs(1,n);
        return num;
    }   
};

猜你喜欢

转载自blog.csdn.net/weixin_51009975/article/details/119754433