假如是有重复元素的全排列怎么办呢?
在dfs枚举每个位置的时候 加一个判断条件 如果这个位置上枚举的数字以前这个位置用过 那就跳过
点击查看代码
//有重复的全排列
#include<cstdio>
#include<algorithm>
using namespace std;
const int MN=105;
int a[MN],n,x,ans[MN],l;
bool vis[MN];
void print()
{
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
printf("\n");
}
void dfs(int k)
{
if(k>n) {print();return;}
int last=-1;
for(int i=1;i<=n;i++)
if(vis[i]==false&&a[i]!=last)
vis[i]=true,ans[k]=a[i],last=a[i],dfs(k+1),vis[i]=false;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
dfs(1);
return 0;
}
不用多说 x&(x-1)
不多说 全排列判断 因为是填空题 所以跑的很慢也没事
不多说 还是一个dfs 我发现蓝桥杯好喜欢考dfs
我感觉依次开方然后减掉开方后的再平方 依次操作四次
正确性我不知道正不正确
就是一道dp题目
dp[i,j] 表示使得区间[i,j] 变为回文串所需删除的最少字符
初始状态 dp[i,i]=0;
转移:如果 s[i]==s[j] dp[i,j]=dp[i-1,j-1]
如果 s[i]!=s[j] dp[i,j]=min(dp[i+1,j],dp[i,j-1])+1
这是唯一一道感觉有难度的题目
首先排序加去重 同时除以最小的数 这样就可以把数列的a0消掉了
然后对第一个数 对它开n次方 然后依次判断
对于开n次方 是可以预处理 i的n次方的 10的10次方就已经1e10了
最后用map存一下就好