Codeforces Round #321 (Div. 2) D. Kefa and Dishes 状压dp
题目链接:
题目
D. Kefa and Dishes
time limit per test:2 seconds
memory limit per test:256 megabytes
问题描述
When Kefa came to the restaurant and sat at a table, the waiter immediately brought him the menu. There were n dishes. Kefa knows that he needs exactly m dishes. But at that, he doesn't want to order the same dish twice to taste as many dishes as possible.
Kefa knows that the i-th dish gives him ai units of satisfaction. But some dishes do not go well together and some dishes go very well together. Kefa set to himself k rules of eating food of the following type — if he eats dish x exactly before dish y (there should be no other dishes between x and y), then his satisfaction level raises by c.
Of course, our parrot wants to get some maximal possible satisfaction from going to the restaurant. Help him in this hard task!
输入
The first line of the input contains three space-separated numbers, n, m and k (1 ≤ m ≤ n ≤ 18, 0 ≤ k ≤ n * (n - 1)) — the number of dishes on the menu, the number of portions Kefa needs to eat to get full and the number of eating rules.
The second line contains n space-separated numbers ai, (0 ≤ ai ≤ 109) — the satisfaction he gets from the i-th dish.
Next k lines contain the rules. The i-th rule is described by the three numbers xi, yi and ci (1 ≤ xi, yi ≤ n, 0 ≤ ci ≤ 109). That means that if you eat dish xi right before dish yi, then the Kefa's satisfaction increases by ci. It is guaranteed that there are no such pairs of indexes i and j (1 ≤ i < j ≤ k), that xi = xj and yi = yj.
输出
In the single line of the output print the maximum satisfaction that Kefa can get from going to the restaurant.
样例
input
2 2 1
1 1
2 1 1
output
3
input
4 3 2
1 2 3 4
2 1 5
3 4 2
output
12
Nodte
In the first sample it is best to first eat the second dish, then the first one. Then we get one unit of satisfaction for each dish and plus one more for the rule.
In the second test the fitting sequences of choice are 4 2 1 or 2 1 4. In both cases we get satisfaction 7 for dishes and also, if we fulfill rule 1, we get an additional satisfaction 5.
题意
有n道菜,每到菜有一个满意度,并且有k个关系,如果在吃了第x道菜之后马上吃第y道,就会增加额外的满意度。现在问你要怎么吃才能使满意度最高。
题解
如果是吃n道菜,就是赤裸裸的状压dp了,不过其实只吃m道菜相当于输出中间过程啦,做完n道菜的之后找dp[i][j]中i的1的个数为m的,更新答案。
(一开始竟然想先从n道中选出m道,然后做状压。。orz)
dp[i][j]表示已经吃了状态i的菜,且最后一次吃的是j的能得到的最大满意度。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define lson (o<<1)
#define rson ((o<<1)|1)
#define M l+(r-l)/2
using namespace std;
const int maxn=20;
typedef __int64 LL;
int n,m,k;
LL dp[1<<maxn][maxn];
int arr[maxn],mat[maxn][maxn];
int main() {
memset(mat,0,sizeof(mat));
scanf("%d%d%d",&n,&m,&k);
for(int i=0; i<n; i++) {
scanf("%d",&arr[i]);
}
while(k--) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w),u--,v--;
mat[v][u]=w;
}
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
dp[1<<i][i]=arr[i];
}
LL ans1=-1;
for(int i=1; i<(1<<n); i++) {
for(int j=0; j<n; j++) {
if(i&(1<<j)) {
for(int k=0; k<n; k++) {
if(k==j) continue;
if(i&(1<<k)) {
dp[i][j]=max(dp[i][j],dp[i^(1<<j)][k]+mat[j][k]+arr[j]);
}
}
}
}
}
LL ans=0;
for(int i=0; i<(1<<n); i++) {
int cnt=0;
for(int k=0; k<n; k++) {
if(i&(1<<k)) cnt++;
}
if(cnt==m) {
for(int j=0; j<n; j++) {
if(i&(1<<j)){
ans=max(ans,dp[i][j]);
}
}
}
}
printf("%I64d\n",ans);
return 0;
}
Codeforces Round #321 (Div. 2) D. Kefa and Dishes 状压dp的更多相关文章
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes(状压dp)
http://codeforces.com/contest/580/problem/D 题意: 有个人去餐厅吃饭,现在有n个菜,但是他只需要m个菜,每个菜只吃一份,每份菜都有一个欢乐值.除此之外,还有 ...
- Codeforces Round #531 (Div. 3) F. Elongated Matrix(状压DP)
F. Elongated Matrix 题目链接:https://codeforces.com/contest/1102/problem/F 题意: 给出一个n*m的矩阵,现在可以随意交换任意的两行, ...
- Codeforces Round #235 (Div. 2) D. Roman and Numbers 状压dp+数位dp
题目链接: http://codeforces.com/problemset/problem/401/D D. Roman and Numbers time limit per test4 secon ...
- Codeforces Round #321 (Div. 2) D Kefa and Dishes(dp)
用spfa,和dp是一样的.转移只和最后一个吃的dish和吃了哪些有关. 把松弛改成变长.因为是DAG,所以一定没环.操作最多有84934656,514ms跑过,实际远远没这么多. 脑补过一下费用流, ...
- Codeforces Round #384 (Div. 2) E. Vladik and cards 状压dp
E. Vladik and cards 题目链接 http://codeforces.com/contest/743/problem/E 题面 Vladik was bored on his way ...
- CF580D Kefa and Dishes 状压dp
When Kefa came to the restaurant and sat at a table, the waiter immediately brought him the menu. Th ...
- Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash
E. Kefa and Watch Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/prob ...
- Codeforces Round #321 (Div. 2) C. Kefa and Park dfs
C. Kefa and Park Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/probl ...
- Codeforces Round #321 (Div. 2) B. Kefa and Company 二分
B. Kefa and Company Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/pr ...
随机推荐
- 坑到了,EF执行带事物的存储过程
用EF开发项目,今天调用 带事物 存储过程,始终报错,"EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配.上一计数 = 1,当前计数 = 0.\r\nEXEC ...
- markdownpad2使用说明
## 欢迎使用 MarkdownPad 2 ## **MarkdownPad** 是 Windows 平台上一个功能完善的 Markdown 编辑器. ### 专为 Markdown 打造 ### 提 ...
- OpenFiler安装与基本配置
一. 安装篇 1. 插入安装盘 2. 选择键盘输出 3. 对硬盘进行分区 4. 删除所有数据并重新分区 5. 配置IP地址等信息 ...
- 【学习笔记】【C语言】函数
一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一 ...
- DBCP--""连接池创建"与"资源关闭"Util类
import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.S ...
- java基础-注解Annotation原理和用法
在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为j ...
- 使用tortoisegit管理git 和 权限验证
1 安装Git 2 安装Tortoise 3 在git.oschina 或者 github上创建项目 4 Tortoise配置 TortoiseGit 使用扩展名为ppk的密钥,而不是ssh-keyg ...
- Matlab2012a第一次安装打不开 查找程序安装类时出错
打开bin文件夹下的matlab!!!!!!进行激活~
- net 中捕获摄像头视频的方式及对比(How to Capture Camera Video via .Net) (转)
作者:王先荣前言 随着Windows操作系统的不断演变,用于捕获视频的API接口也在进化,微软提供了VFW.DirectShow和MediaFoundation这 三代接口.其中VFW早已被Di ...
- 工厂方法模式与IoC/DI控制反转和依赖注入
IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁 ...