题目传送门

友情链接: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进行标号,符合二进制的传统,就比较舒服。

最新文章

  1. Spark的持久化简记
  2. 【linux草鞋应用编程系列】_3_ 进程间通信
  3. 如何区分Babel中的stage-0,stage-1,stage-2以及stage-3(二)
  4. EF架构~linq模拟left join的两种写法,性能差之千里!
  5. 10个出色的NoSQL数据库
  6. UITableViewCell动态AutoLayout布局
  7. JavaScript函数小结
  8. SVN版本管理提示信息
  9. 转 :hdoj 4857 逃生【反向拓扑】
  10. Day8 - Python网络编程 Socket编程
  11. HTML5摇一摇
  12. 左侧高亮(js)
  13. Java经典编程题50道之十
  14. [Luogu3041][USACO12JAN]视频游戏的连击Video Game Combos
  15. 2017-2018-2 20165237 实验二《Java面向对象程序设计》实验报告
  16. Java的家庭记账本程序(B)
  17. PyCharm的模板设置
  18. MongoDB的Java驱动使用整理 (转)
  19. 评价linux协议栈tcp实现中的prequeue
  20. js处理数组问题,以及数组转化问题

热门文章

  1. Distributed Management Task Force----分布式管理任务组
  2. MySql 查询一周内记录
  3. GIF Movie Gear逆向实战+注册代码+补丁
  4. Smoke testing (software)
  5. These interactions can be expressed as complicated, large scale graphs. Mining data requires a distributed data processing engine
  6. Linux搭建lnmp环境
  7. 详解likely和unlikely函数【转】
  8. POJ3579 Median —— 二分
  9. fuse的mount机制 2 -系统调用mount
  10. javascript break 和continue