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 ...
 
随机推荐
- 运行第一个Node.js程序
			
初学Node.js,萌新一枚.感觉Node.js挺不错的,从基础开始一步一步来,加油吧! 我们来使用Node.js的express来运行第一个程序helloworld: 在命令提示符键入express ...
 - Cocos移植到Android的一些问题-中文乱码问题
			
Android平台版本和设备碎片化很严重,因此从Win32平台移植到Android平台会有很多问题,下面是我们归纳的从Win32平台移植到Android平台遇到的一些问题.在Android平台中文乱码 ...
 - 了解常见的开源协议(BSD, GPL, LGPL,MIT)
			
一直对各种开源协议比较模糊, 特意在网上搜索了一下资料, 整理总结,以作记录 如果不喜欢长篇大论的话, 看下图就可以了 基本概念了解: 1. Contributors 和 Recipients Con ...
 - Codevs  1105 过河
			
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有 ...
 - 【转】使用Memcached提高.NET应用程序的性能
			
在应用程序运行的过程中总会有一些经常需要访问并且变化不频繁的数据,如果每次获取这些数据都需要从数据库或者外部文件系统中去读取,性能肯定会受到影响,所以通常的做法就是将这部分数据缓存起来,只要数据没有发 ...
 - 使用JDBC从数据库中查询数据
			
* ResultSet 结果集:封装了使用JDBC 进行查询的结果 * 1. 调用Statement 对象的 executeQuery(sql) 方法可以得到结果集 * 2. ResultSet 返回 ...
 - setLayoutParams设置leftMargin后在模拟器上可以真机上不行
			
LinearLayout.LayoutParams lp = getLayoutParamsFromExit( (LayoutParams) this.getLayoutParams()); ...
 - rhel_7.x 安装mysql
			
http://database.51cto.com/art/201310/413006.htm MariaDB和MySQL --mysql-5.7.12-1.el7.x86_64.rpm-bundle ...
 - 为什么要用ajax
			
Ajax应用程序的优势在于:1. 通过异步模式,提升了用户体验2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工 ...
 - Odoo 库存管理-库存移动(Stock Move)新玩法
			
库存移动(Stock Move)新玩法 Odoo的库存移动不仅仅是存货在两个“存货地点”之间的移动的基本概念了,他们可以被“串联”在一起,可以用来生成或改变其对应的拣货单 (Picking).链式库存 ...