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 ...
随机推荐
- 六、Android学习笔记_JNI_c调用java代码
1.编写native方法(java2c)和非native方法(c2java): package com.example.provider; public class CallbackJava { // ...
- table表格实现点击修改 PHP同步数据库 排序
最近几天在做一个网站,牵扯到一个导航管理的功能!领导说不用作,可是由于自己自作主张,搞了1天的功能.领导说这个导航管理就是不用做!容易牵扯出好多问题来!估摸是客户小的原因! 没办法就把我1天的劳动荒废 ...
- 集合框架学习之Guava Collection
开源工具包: Guava : Google Collection Apache:Commons Collecton 1.1 Google Collections Guava:google的工程师利用传 ...
- HTML+CSS学习笔记 (13) - CSS代码缩写,占用更少的带宽
标签:HTML+CSS 盒模型代码简写 还记得在讲盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左.具体应用在m ...
- 转载:python文件打开方式详解——a、a+、r+、w+区别
第一步 排除文件打开方式错误: r只读,r+读写,不创建 ###f.readline()是读取第一行,f.readlines()是读取全部并返回一个列表 w新建只写,w+新建读写,会将文件内 ...
- Integer类的装箱和拆箱到底是怎样实现的?
先解释一下装箱和拆箱: 装箱就是 自动将基本数据类型转换为包装器类型:拆箱就是 自动将包装器类型转换为基本数据类型. 下表是基本数据类型对应的包装器类型: int(4字节) Integer byt ...
- request.getSession();为什么不用response儿用request!
首先回答为什么分别是response和request这两个内置对象.你得先明白你通过获取对象是做什么用的,是往哪用的.第一个PrintWriter out=response.getWriter()是想 ...
- Mysql支持中文全文检索的插件mysqlcft-应用中的问题
MySQL目前版本的全文检索没有对中文很好的支持,但可以通过安装mysqlcft插件来实现,具体的安装使用方法:http://blog.s135.com/post/356/ mysqlcft的官方网站 ...
- 2013-07-26 IT 要闻速记快想
### ========================= ###传Google正在内测供用户买卖技能的电商平台Helpout,最早于下月上线该服务将依托Google强大的云服务和搜索能力,以实时视频 ...
- C#中Delegate
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...