您的位置:首页 > 其它

codeforces 580D Kefa and Dishes

2015-09-25 11:40 393 查看
传送门:http://codeforces.com/problemset/problem/580/d

思路:状压DP,f[i][j]表示最后一个为i,已选取的菜的状态为j。

#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxt=540000;
using namespace std;
typedef long long ll;
int n,m,k,g[20][20],a[20],pow[20];ll f[20][maxt],ans;

int main(){
pow[0]=1;for (int i=1;i<=19;i++) pow[i]=pow[i-1]<<1;
scanf("%d%d%d",&n,&m,&k);
for (int i=0;i<n;i++) scanf("%d",&a[i]);
for (int i=1,x,y,z;i<=k;i++) scanf("%d%d%d",&x,&y,&z),x--,y--,g[x][y]=z;
for (int i=0;i<n;i++) f[i][pow[i]]=a[i];
for (int i=1;i<m;i++)
for (int s=0;s<pow
;s++){
int cnt=0;
for (int j=0;j<n;j++) if (s&pow[j]) cnt++;
if (cnt!=i) continue;
for (int j=0;j<n;j++)
if (!(s&pow[j])){
for (int k=0;k<n;k++)
if (s&pow[k])
f[j][s|pow[j]]=max(f[j][s|pow[j]],f[k][s]+a[j]+g[k][j]);
}
}
for (int s=0;s<pow
;s++){
int cnt=0;
for (int j=0;j<n;j++) if (s&pow[j]) cnt++;
if (cnt!=m) continue;
for (int i=0;i<n;i++) ans=max(ans,f[i][s]);
}
printf("%I64d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: