CF580D Kefa and Dishes 【状压dp】By cellur925
友情链接:new2zydalao%%% 一篇优秀的状压文章
题目大意:$n$个菜有$k$个规则,如果kefa在吃完第$xi$个菜之后吃了第$yi$个菜(保证$xi$、$yi$不相等),
那么会额外获得$ci$ (0<=$ci$<=$10^9$)(0<=$ci$<=$10^9$)的满意度。(0<$n$<=18).但是他希望自己吃菜的顺序得到的满意度最大,
请你帮帮kefa吧!
数据范围这么小==,应该会用到状压的。但是之前状压都是那些比较明显的在棋盘上的类型,这种完全布吉岛如何设计状态及转移。
上次做的类似题是NOIp2017宝藏。其实感觉这种题有一个(较)固定的思路:设$f[i][j]$表示当前状态为$i$,目前在$j$。这次我们可以如出一辙,设$f[i][j]$表示为当前状态为$i$,最后吃的一道菜为$j$获得的最大满意度。
好啦。有了状态,转移就不难了。我们枚举当前状态以及当前吃的最后一个菜,再枚举吃的上一个菜,那么显然有方程$f[i][j]=$max(f[i^(1<<i)][k]+a[j]+w[j][k])$。注意一下细节及初值就行了,感觉本题并没有太难==。
$Code$
#include<cstdio>
#include<algorithm> using namespace std;
typedef long long ll; int n,m,qwq;
ll ans,a[],f[][],w[][]; int count(int x)
{
int tmp=;
while(x)
tmp+=(x&),x>>=;
return tmp;
} int main()
{
scanf("%d%d%d",&n,&m,&qwq);
for(int i=;i<n;i++) scanf("%lld",&a[i]),f[(<<i)][i]=a[i];
for(int i=;i<=qwq;i++)
{
ll x=,y=;
scanf("%lld%lld",&x,&y);
scanf("%lld",&w[x-][y-]);
}
int fAKe=(<<n)-;
for(int i=;i<=fAKe;i++)
{
int sum=count(i);
for(int j=;j<n;j++)
{
if(!(i&(<<j))) continue;
for(int k=;k<n;k++)
{
if(!(i&(<<k))||k==j) continue;
f[i][j]=max(f[i][j],f[i^(<<j)][k]+w[k][j]+a[j]);
}
if(sum==m) ans=max(ans,f[i][j]);
}
}
printf("%lld",ans);
return ;
}
本题中还运用到了一个小技巧(和sjtdalao学的)。位运算我们都知道从0开始搞,那么有时我们为了方便书写,把给出的元素从0~n-1进行标号,符合二进制的传统,就比较舒服。
CF580D Kefa and Dishes 【状压dp】By cellur925的更多相关文章
- 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) 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)
题意:给定n个菜,每个菜都有一个价值,给定k个规则,每个规则描述吃菜的顺序:i j w,按照先吃i接着吃j,可以多增加w的价值.问如果吃m个菜,最大价值是多大.其中n<=18 思路:一看n这么小 ...
- Codeforces Round #321 (Div. 2) Kefa and Dishes 状压+spfa
原题链接:http://codeforces.com/contest/580/problem/D 题意: 给你一些一个有向图,求不超过m步的情况下,能获得的最大权值和是多少,点不能重复走. 题解: 令 ...
- D. Kefa and Dishes(状压)
永久打开的传送门 \(这次总算没有写砸........\) \(设f[i][j]为上一次吃的i物品状态为j的最大收益\) \(那么我们就暴力枚举所有状态i,然后在当前状态找出一个没吃的食物j,再去找一 ...
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes(状压dp)
http://codeforces.com/contest/580/problem/D 题意: 有个人去餐厅吃饭,现在有n个菜,但是他只需要m个菜,每个菜只吃一份,每份菜都有一个欢乐值.除此之外,还有 ...
- 【62测试】【状压dp】【dfs序】【线段树】
第一题: 给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去. 比如,BBRB则会形成 BBRBBBRBBBRB 现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标 ...
- 状压dp入门
状压dp的含义 在我们解决动态规划题目的时候,dp数组最重要的一维就是保存状态信息,但是有些题目它的具有dp的特性,并且状态较多,如果直接保存的可能需要三维甚至多维数组,这样在题目允许的内存下势必是开 ...
- [CF580D]Kefa and Dishes
题意翻译 kefa进入了一家餐厅,这家餐厅中有n个菜(0<n<=18),kefa对第i个菜的满意度为ai(0<=ai<=10^9),并且对于这n个菜有k个规则,如果kefa在吃 ...
随机推荐
- 微信小程序项目实例
目前为止最全的微信小程序项目实例 2018年03月20日 11:38:28 Happy王子乐 阅读数:4188 wx-gesture-lock 微信小程序的手势密码 WXCustomSwitch ...
- CSDN-markdown编辑器之从线上导入Markdown文件
CSDN-markdown编辑器支持从线上导入Markdown文件的功能,假设你用其他支持Markdown的编辑器在网上写了博客文章或说明档,想公布到CSDN博客中,就能够使用本功能非常方便的完毕 ...
- linux块设备驱动(一)——块设备概念介绍
本文来源于: 1. http://blog.csdn.net/jianchi88/article/details/7212370 2. http://blog.chinaunix.net/uid-27 ...
- adb问题整理
1.开启了两个adb,关掉一个,重启eclipse既可 java.io.IOException: 您的主机中的软件中止了一个已建立的连接. at sun.nio.ch.SocketDispatcher ...
- HDOJ--1869--六度分离(用三种算法写的,希望能比較出来他们之间的差别)
六度分离 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Python2.7安装教程
作者:zhanhailiang 日期:2014-11-16 [root@~/software]# yum install bzip* [root@~/software]# wget http://ww ...
- Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo DP+矩阵快速幂加速
E. Okabe and El Psy Kongroo Okabe likes to take walks but knows that spies from the Organization ...
- 浅谈 React、Flux 与 Redux
React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化利用 props 形成单向的数据流根据 state 的变化来更新 view利用虚拟 DOM 来提升渲染性能 ...
- 谈谈Paxos一致性算法和一致性这个名词
转自:http://www.cnblogs.com/esingchan/p/3917718.html 维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的& ...
- java中创建对象的五种方法
用最简单的描述来区分new关键字和newInstance()方法的区别:newInstance: 弱类型.低效率.只能调用无参构造.new: 强类型.相对高效.能调用任何public构造. newIn ...