Codeforces580D. Kefa and Dishes

http://codeforces.com/problemset/problem/580/D

  状态压缩DP。

#include<bits/stdc++.h>
const int maxn=18;
using namespace std;
typedef long long int64;
typedef pair<int,int> PII;
int64 f[maxn+1][1<<maxn];
vector<PII> l[maxn+1];
int n,m,k,w[maxn];
void init(){
    scanf("%d%d%d",&n,&m,&k);
    for (int i=0;i<n;++i) scanf("%d",&w[i]);
    for (int x,y,v,i=1;i<=k;++i){
        scanf("%d%d%d",&x,&y,&v);--x;--y;
        l[x].push_back(make_pair(y,v));
    }
}
void work(){
    memset(f,-1,sizeof(f));
    f[n][0]=0;int64 ans=0;
    for (int i=0;i<1<<n;++i){
        for (int j=0;j<=n;++j){
            if (f[j][i]==-1) continue;
            for (int k=0;k<n;++k){
                if ((i>>k)&1) continue;
                int reward=0;
                for (int x=0;x<l[j].size();++x)
                    if (l[j][x].first==k) reward=l[j][x].second;
                f[k][i|(1<<k)]=max(f[j][i]+w[k]+reward,f[k][i|(1<<k)]);
            }
        }
        int bit=0;
        for (int j=0;j<n;++j) if ((i>>j)&1) ++bit;
        if (bit==m) for (int j=0;j<=n;++j) ans=max(ans,f[j][i]);
    }
    printf("%I64d\n",ans);
}
int main(){
    init();
    work();
    return 0;
}
my code

 

posted @ 2015-09-25 11:38  iamCYY  阅读(182)  评论(0编辑  收藏  举报