codeforces 580D Kefa and Dishes

 2023-09-09 阅读 16 评论 0

摘要:传送门:http://codeforces.com/problemset/problem/580/d 思路:状压DP,f[i][j]表示最后一个为i,已选取的菜的状态为j。 happiness。 #include<cstdio> #include<cstring> #include<algorithm> const int maxt=540000; usi

传送门:http://codeforces.com/problemset/problem/580/d

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


happiness。

#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[n];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[n];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;
}


转载于:https://www.cnblogs.com/thythy/p/5493527.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/22342.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息