Distinctive Character

 Distinctive Character

 Sol

bfs寻找最优解。

考虑一开始把他给的状态加进队列里,这些状态的答案都是0。

每次枚举不同的一位拓展,同时要保证这个新状态没有出现过。

效率O(2^k)

话说我随机化85呢

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 1000005
using namespace std;
int n,k,ans,s[maxn],num[maxn],f[maxn],a[maxn];
int d[maxn];
queue<int>q;
int get(int x){
    int sum=0;
    for(int i=0;i<20;i++)if(x&(1<<i))sum++;
    return k-sum;
}
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            char ch;scanf(" %c",&ch);
            if(ch=='1')a[i]|=(1<<(j-1));
        }
    }
    for(int i=0;i<(1<<k);i++)num[i]=get(i);
    for(int i=1;i<=n;i++)d[a[i]]=1,q.push(a[i]);
    int Max;
    while(!q.empty()){
        int x=q.front();q.pop();
        Max=x;
        for(int i=0;i<k;i++){
            if(!d[x^(1<<i)])d[x^(1<<i)]=d[x]+1,q.push(x^(1<<i));
        }
    }
    for(int i=0;i<k;i++)if(Max&(1<<i))putchar('1');else putchar('0');
    return 0;
}
原文地址:https://www.cnblogs.com/liankewei/p/11975734.html