2741. 特别的排列
题目链接:2741. 特别的排列
代码如下:
//参考链接:https://leetcode.cn/problems/special-permutations/solutions/2312798/zhuang-ya-dp-by-endlesscheng-4jkr
class Solution
{
public:
int specialPerm(vector<int>& nums)
{
int n=nums.size(),u=(1<<n)-1;
vector<vector<long long>> memo(u,vector<long long>(n,-1));
auto dfs=[&](auto&& dfs,int s,int i)->long long
{
if(s==0) {return 1;}// 找到一个特别排列
auto& res=memo[s][i];// 注意这里是引用
if(res!=-1) {return res;}// 之前计算过
res=0;
for(int j=0;j<n;j++)
{
if((s>>j&1)&&(nums[i]%nums[j]==0||nums[j]%nums[i]==0))
{
res+=dfs(dfs,s^(1<<j),j);
}
}
return res;
};
long long res=0;
for(int i=0;i<n;i++)
{
res+=dfs(dfs,u^(1<<i),i);
}
return res%1'000'000'007;
}
};