标签:
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; }
Codeforces580D. Kefa and Dishes
标签:
原文地址:http://www.cnblogs.com/iamCYY/p/4837714.html