题目来源于知识星球—英雄算法联盟,七月算法集训专题
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
又到了每月的最后一天了,让我们看看有什么题!
一、526.优美的排列(中等)
1.题目描述
2.解题思路
如果前面的某些数已经确定,那么我们用一个二进制位来表示,如果二进制位为1,那么说明这个数出现过,
遍历所有的情况,之后再用深度优先搜索求解即可。
3.代码演示(C++)
class Solution
{
#define maxn 16
int dp[maxn][1<<maxn];
int dfs(int max, int n, int mask)
{
int ans;
int i;
if(n == 0)
{
return 1;
}
if(dp[n][mask] != -1)
{
return dp[n][mask];
}
ans = 0;
for(i = 1; i <= max; ++i)
{
if(mask&(1<<(i-1)))
{
continue;
}
if(n%i&& i%n)
{
continue;
}
mask |= (1<<(i-1));
ans += dfs(max, n-1, mask);
mask ^= (1<<(i-1));
}
return dp[n][mask] = ans;
}
public:
int countArrangement(int n)
{
memset(dp, -1, sizeof(dp));
return dfs(n, n, 0);
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!