您的位置:首页 > 其它

Codeforces580D. Kefa and Dishes

2015-09-25 11:38 337 查看
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
[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: