这题是一道简单的搜索题,相信大家都有些许思路了,这题我用的是二进制枚举
二进制枚举
顾名思义,就是一个枚举子集的方法,每个项目有两种选择,要么选,要么不选两种方法,故称“二进制枚举”
注意,dfs最重要的便是递归出口,一定要先更新答案再判断出口,详见代码
#include<bits/stdc++.h>
using namespace std;
int n,k;
string s[20];
map<char,int>m;
int ans;
void dfs(int step){
int cnt=0;
for(auto it:m){//看看此时有几个满足条件
if(it.second==k) cnt++;
}
ans=max(ans,cnt);//更新
if(step>n) return ;//前面说过了,出口要放在更新答案之后
for(int i=0;i<s[step].size();i++){
m[s[step][i]]++;
}//加上这个字母的数量
dfs(step+1);//1选他
for(int i=0;i<s[step].size();i++){
m[s[step][i]]--;
}//还原现场
dfs(step+1);//2不选他
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) cin>>s[i];
dfs(1);
printf("%d",ans);
return 0;
}