codeforces round 321 div2 D Kefa and Dishes(状态压缩dp)
2015-10-02 15:35
519 查看
题意:一共n道菜,吃m道,有k个规则,每个菜有自己的价值,每个规则说明吃完X接着吃Y可以额外获得Z个价值。
问可以获得的最大价值是多少。
思路:1<<18保存所有状态,第二维保存最后吃的哪道菜,然后从吃的菜里选一道,从没吃的菜里选一道,吃完X吃Y,
更新dp,判断一下是否当前吃了m道,更新ans便可
问可以获得的最大价值是多少。
思路:1<<18保存所有状态,第二维保存最后吃的哪道菜,然后从吃的菜里选一道,从没吃的菜里选一道,吃完X吃Y,
更新dp,判断一下是否当前吃了m道,更新ans便可
#include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <vector> #include <cstdio> #include <string> #include <set> using namespace std; #define inf 0x3f3f3f3f #define maxn 100005 #define sf(x) scanf("%d",&x) #define sf(x,y) scanf("%d%d",&x,&y) #define fre freopen("in.txt","r",stdin) const int M=262150; int v[20],s[20][20]; long long dp[M][20]; int main() { //fre; int n,m,k,x,y,z; long long ans=0; scanf("%d%d%d",&n,&m,&k); memset(s,0,sizeof(s)); memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) scanf("%d",&v[i]); for(int i=0;i<k;i++) { scanf("%d%d%d",&x,&y,&z); s[x-1][y-1]=z; } for(int i=0;i<n;i++) dp[1<<i][i]=v[i]; int cnt=1<<n; for(int l=0;l<cnt;l++) { int cntt=0; for(int i=0;i<n;i++) { if((l&(1<<i))==0) continue; cntt++; for(int j=0;j<n;j++) { if(l&(1<<j)) continue; int ne=l|(1<<j); dp[ne][j]=max(dp[ne][j],dp[l][i]+v[j]+s[i][j]); } } if(cntt==m) { for(int i=0;i<n;i++) { if(l&(1<<i)) ans=max(ans,dp[l][i]); } } } printf("%lld\n",ans); return 0; }
相关文章推荐
- lca
- 结对编程任务的算法流程思路
- 2013 ACM-ICPC吉林通化全国邀请赛 && HDU 4499 Cannon (搜索)
- Single Number III -- leetcode
- 欧几里得算法求两个正整数的最大公因子
- redis教程(二):安装遇到的某些问题
- 冒泡排序算法 C++和PHP达到
- Light oj 1038 - Race to 1 Again(概率dp)
- Aoj 2450 Do use segment tree【树链剖分】
- 图论——拓扑排序
- sql笔记
- iOS开发TTS技术即文本转语音
- 微信支付文档链接
- 通过官网下载hibernate5 的jar
- hdu 4788 (2013成都现场赛 H题)
- 利用结果集元数据将查询结果封装成Map
- 8-v4l2——basic frame IO 基本的帧缓冲IO 输入输出
- iOS多线程使用实例(异步下载图片的时候不会阻塞主线程的执行)
- Eclipse建筑物SSH(struts-2.2.3 + spring-2.5.6 + hibernate-3.6.8)相框-随着源代码
- JAVA 日期赋值及比较