TopCoder SRM 571 Div2 1000 MagicMoleculeEasy

震惊!竟然就是个爆搜……
爆搜每条边上选哪个点,如果最后还没选满 K 个,就挑没选过的点里大的选。
代码有点丑。。

#include <bits/stdc++.h>
using namespace std;
const int N=51;
const int M=N*N;
int n,m,a[N],b[N],K,num[N];
int u[M],v[M];
int ans,s;

class MagicMoleculeEasy {
public:
    int maxMagicPower( vector <int> magicPower, vector <string> magicBond, int k );
};

int pd(int x){
    for(int i=x;i<=m;i++)
     if (b[u[i]]==0&&b[v[i]]==0) return 0;
    return 1;
}

void dfs(int x,int k){
    if (k>K) return;
    if (x>m||k==K){
        if (k<K){
            int s0=s;
            for(int i=1;i<=n;i++)
             if (b[num[i]]==0){
                s+=a[num[i]];
                k++;
                if (k==K) break;
             }
            if (k==K) ans=max(ans,s);
            s=s0;
            return;
        }
        if (pd(x)) ans=max(ans,s);
        return; 
    }
    while((b[u[x]]||b[v[x]])&&x<=m) x++;
    if (x>m){ dfs(x,k);return; }
    int s0=s;
    b[v[x]]=1;s+=a[v[x]];
    dfs(x+1,k+1);
    b[u[x]]=1;s+=a[u[x]];
    dfs(x+1,k+2);
    b[v[x]]=0;s=s0+a[u[x]];
    dfs(x+1,k+1);
    b[u[x]]=0;s=s0;
}

int cmp(const int &q,const int &w){
    return a[q]>a[w];
}

int MagicMoleculeEasy::maxMagicPower(vector <int> c, vector <string> map, int k) {
    n=c.size();K=k;
    if (k>n) return -1;
    for(int i=0;i<n;i++) a[i+1]=c[i],num[i+1]=i+1;
    sort(num+1,num+1+n,cmp);
    for(int i=0;i<n-1;i++)
     for(int j=i+1;j<n;j++)
      if (map[i][j]=='Y') u[++m]=i+1,v[m]=j+1;
    ans=-1;
    dfs(1,0);
    return ans;
}

猜你喜欢

转载自blog.csdn.net/ymzqwq/article/details/81673646