codeforces 580D Kefa and Dishes(状压dp)
题意:给定n个菜,每个菜都有一个价值,给定k个规则,每个规则描述吃菜的顺序:i j w,按照先吃i接着吃j,可以多增加w的价值。问如果吃m个菜,最大价值是多大。其中n<=18
思路:一看n这么小,除了暴力之外就得想想状态压缩dp了。因为每种菜正好两种状态(吃过与没吃过),正好可以使用二进制来表示每种状态,那么一共有(1<<n)位种可能,即从状态(000...0)到状态(111...1),所以定义状态dp[s][i],表示状态为s时,并且最后吃第i种菜的时候的最大值。那么转移方程就是
dp[s|(1<<j)] = max(dp[s|(1<<j)], dp[s][i] + ary[i] + ad[i][j];
其中ary表示每种菜的价值,ad[i][j]表示先吃i再吃j的价值。注意状态方程转移的条件:第i位已经选择过,第j位没有选择过。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = ( << ) + ;
long long dp[maxn][];
long long ary[];
long long ad[][];
int main()
{
int n, m, k, u, v, w;
scanf("%d%d%d", &n, &m, &k);
for (int i = ; i < n; i++) cin >> ary[i];
for (int i = ; i < k; i++)
{
scanf("%d%d%d", &u, &v, &w);
u--; v--;
ad[u][v] = w;
}
for (int i = ; i < n; i++)
dp[<<i][i] = ary[i];
long long ans = ;
int tot = << n;
for (int s = ; s < tot; s++)
{
int cnt = ;
for (int i = ; i < n; i++)
{
if ((s & ( << i)) != )
{
cnt++;
for (int j = ; j < n; j++)
{
if ((s & (<<j)) == ) //be careful the priority of operator
{
int ss = s | ( << j);//the next state
dp[ss][j] = max(dp[ss][j], dp[s][i] + ary[j] + ad[i][j]); } } }
}
if (cnt == m)
{
for (int i = ; i < n; i++)
if ((s & (<<i)) != ) ans = max(ans, dp[s][i]);
}
}
cout << ans << endl; return ;
}
codeforces 580D Kefa and Dishes(状压dp)的更多相关文章
- 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 问题描述 W ...
- Codeforces ----- Kefa and Dishes [状压dp]
题目传送门:580D 题目大意:给你n道菜以及每道菜一个权值,k个条件,即第y道菜在第x道后马上吃有z的附加值,求从中取m道菜的最大权值 看到这道题,我们会想到去枚举,但是很显然这是会超时的,再一看数 ...
- Codeforces 580D Kefa and Dishes(状态压缩DP)
题目链接:http://codeforces.com/problemset/problem/580/D 题目大意:有n盘菜每个菜都有一个满意度,k个规则,每个规则由x y c组成,表示如果再y之前吃x ...
- CF580D Kefa and Dishes 状压dp
When Kefa came to the restaurant and sat at a table, the waiter immediately brought him the menu. Th ...
- dp + 状态压缩 - Codeforces 580D Kefa and Dishes
Kefa and Dishes Problem's Link Mean: 菜单上有n道菜,需要点m道.每道菜的美味值为ai. 有k个规则,每个规则:在吃完第xi道菜后接着吃yi可以多获得vi的美味值. ...
- codeforces 580D. Kefa and Dishes
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- Codeforces Round #363 LRU(概率 状压DP)
状压DP: 先不考虑数量k, dp[i]表示状态为i的概率,状态转移方程为dp[i | (1 << j)] += dp[i],最后考虑k, 状态表示中1的数量为k的表示可行解. #incl ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- Codeforces 429C Guess the Tree(状压DP+贪心)
吐槽:这道题真心坑...做了一整天,我太蒻了... 题意 构造一棵 $ n $ 个节点的树,要求满足以下条件: 每个非叶子节点至少包含2个儿子: 以节点 $ i $ 为根的子树中必须包含 $ c_i ...
随机推荐
- 【Xamarin挖墙脚系列:最重要的布局ListView】
原文:[Xamarin挖墙脚系列:最重要的布局ListView] 安卓的几个重要的布局 线性布局 相对布局 Table布局 Tab布局 表格Grid布局 列表布局. 这几种基本的布局的方式,最重要 ...
- swift 学习资源
http://blog.csdn.net/sqc3375177/article/details/29206779
- Listview 异步加载图片之优化篇(有图有码有解释)
在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...
- XtraForm默认皮肤的显示
1.新建一个XtraForm窗体 2.运行显示这个窗体,会发现没有任何变化,显示的还是winform的样式 3.在Program.cs文件的Main函数中添加 DevExpress.Skins.Ski ...
- 段错误调试神器 - Core Dump详解
一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得 ...
- 英语之路 zt
各位为英语而郁闷的兄弟姐妹们: 自从考完GRE和TOEFL以后,心有所感,本想写点心得,但是因为太懒没写成.今日风雨如晦,心中又有所感,于是一舒笔墨,写下我学英语的方法.俺知道有很多兄弟姐妹们和曾经的 ...
- 监控Tomcat并启动
#!/bin/sh export _JAVA_SR_SIGNUM= export JAVA_HOME=/usr/java/jdk1..0_11 export CATALINA_BASE=/home/c ...
- 《C语言程序设计现代方法》第2章 C语言基本概念
C语言的基本概念 第一个C程序例子. /* pun.c */ #include <stdio.h> int main(void) { printf("To C, or not t ...
- hdoj 2795 Billboard【线段树区间最大值】
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Redis未授权访问缺陷让服务器沦为肉鸡
朋友的一个项目说接到阿里云的告警,提示服务器已沦为肉鸡,网络带宽被大量占用,网站访问很慢,通过SSH远程管理服务器还频繁断开链接.朋友不知如何下手,便邀请我帮忙处理. 阿里云的安全告警邮件内容: 在没 ...