题意:

思路:n<=12,考虑状压DP

生成树中深度相同的点可以一次性转移完毕

设dp[sta,i]为已转移完sta状态的点,当前深度为i的最小花费

dp[sta or v,i+1]=min(dp[sta,i]+f[sta,v]*(i+1)),其中v是sta关于全集(1<<n)-1的补集v1的一个子集,这一步需要枚举子集

考场上写的O(3^n*n^2),没有预处理f[sta,v]而是每次都算了一遍,有进一步优化的空间

  1. const max=;
  2. var dp,dis:array[..,..]of int64;
  3. f:array[..,..]of int64;
  4. n,m,i,j,x,y,z,k,maxs,v,v1:longint;
  5. s,ans:int64;
  6.  
  7. function min(x,y:int64):int64;
  8. begin
  9. if x<y then exit(x);
  10. exit(y);
  11. end;
  12.  
  13. begin
  14. assign(input,'treasure.in'); reset(input);
  15. assign(output,'treasure.out'); rewrite(output);
  16. readln(n,m);
  17. for i:= to n do
  18. for j:= to n do f[i,j]:=<<;
  19. for i:= to n do f[i,i]:=;
  20. for i:= to m do
  21. begin
  22. readln(x,y,z);
  23. f[x,y]:=min(f[x,y],z);
  24. f[y,x]:=min(f[y,x],z);
  25. end;
  26. maxs:=(<<n)-;
  27. for i:= to maxs do
  28. for j:= to n do
  29. if i and (<<(j-))= then
  30. begin
  31. dis[i,j]:=<<;
  32. for k:= to n do
  33. if (j<>k)and(i and (<<(k-))>) then dis[i,j]:=min(dis[i,j],f[j,k]);
  34. end;
  35.  
  36. m:=maxs;
  37. for i:= to maxs do
  38. for j:= to n+ do dp[i,j]:=<<;
  39. for i:= to n do dp[<<(i-),]:=;
  40. for i:= to n do
  41. for j:= to maxs do
  42. begin
  43. v:=j xor m; v1:=v;
  44. while v> do
  45. begin
  46. s:=;
  47. for k:= to n do
  48. if v and (<<(k-))> then
  49. begin
  50. s:=s+dis[j,k];
  51. if s>=(<<) then break;
  52. end;
  53. if s<(<<) then
  54. dp[j or v,i+]:=min(dp[j or v,i+],dp[j,i]+s*(i+));
  55. v:=v1 and (v-);
  56. end;
  57. end;
  58. ans:=<<;
  59. for i:= to n+ do ans:=min(ans,dp[maxs,i]);
  60. if n= then ans:=;
  61. writeln(ans);
  62.  
  63. close(input);
  64. close(output);
  65. end.

O(3^n*n),预处理两个值

d[sta,i]      已取sta状态中的点到i点的最小值 预处理O(2^n*n^2)

f[x,y]      x状态中的点和y状态中的所有点连接最小长度之和=f[x,y-lowbit(y)]+d[x,z],z表示y中最后一个1的位置 预处理O(4^n) 需要保证x与y没有交集

  1. const max=;
  2. var dp,d:array[..,..]of int64;
  3. dis:array[..,..]of int64;
  4. f:array[..,..]of int64;
  5. num:array[..]of longint;
  6. n,m,i,j,x,y,z,k,maxs,v,v1:longint;
  7. s,ans:int64;
  8.  
  9. function min(x,y:int64):int64;
  10. begin
  11. if x<y then exit(x);
  12. exit(y);
  13. end;
  14.  
  15. function lowbit(x:longint):longint;
  16. begin
  17. exit(x and (-x));
  18. end;
  19.  
  20. begin
  21. assign(input,'treasure.in'); reset(input);
  22. assign(output,'treasure.out'); rewrite(output);
  23. readln(n,m);
  24. for i:= to n do
  25. for j:= to n do f[i,j]:=<<;
  26. for i:= to n do f[i,i]:=;
  27. for i:= to m do
  28. begin
  29. readln(x,y,z);
  30. f[x,y]:=min(f[x,y],z);
  31. f[y,x]:=min(f[y,x],z);
  32. end;
  33.  
  34. maxs:=(<<n)-;
  35. for i:= to maxs do
  36. for j:= to n do
  37. if i and (<<(j-))= then
  38. begin
  39. d[i,j]:=<<;
  40. for k:= to n do
  41. if (j<>k)and(i and (<<(k-))>) then d[i,j]:=min(d[i,j],f[j,k]);
  42. end;
  43.  
  44. m:=maxs;
  45. for i:= to do num[<<(i-)]:=i;
  46. for i:= to maxs do
  47. for j:= to maxs do dis[i,j]:=<<;
  48. for i:= to maxs do dis[,i]:=;
  49. for i:= to maxs do dis[i,]:=;
  50.  
  51. for i:= to maxs do
  52. for j:= to maxs do
  53. if i and j= then
  54. begin
  55. x:=num[lowbit(j)];
  56. dis[i,j]:=dis[i,j-lowbit(j)]+d[i,x];
  57. if dis[i,j]>(<<) then dis[i,j]:=<<;
  58. end;
  59.  
  60. for i:= to maxs do
  61. for j:= to n+ do dp[i,j]:=<<;
  62. for i:= to n do dp[<<(i-),]:=;
  63. for i:= to n do
  64. for j:= to maxs do
  65. begin
  66. v:=j xor m; v1:=v;
  67. while v> do
  68. begin
  69. if dis[j,v]<<< then
  70. dp[j or v,i+]:=min(dp[j or v,i+],dp[j,i]+dis[j,v]*(i+));
  71. v:=v1 and (v-);
  72. end;
  73. end;
  74.  
  75. ans:=<<;
  76. for i:= to n+ do ans:=min(ans,dp[maxs,i]);
  77. if n= then ans:=;
  78. writeln(ans);
  79.  
  80. close(input);
  81. close(output);
  82. end.

【NOIP2017】宝藏(状压DP)的更多相关文章

  1. [NOIP2017]宝藏 状压DP

    [NOIP2017]宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖 ...

  2. 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$

    正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ...

  3. Luogu 3959 [NOIP2017] 宝藏- 状压dp

    题解 真的想不到这题状压的做法...听说还有跑的飞快的模拟退火,要是现场做绝对滚粗QAQ. 不考虑深度,先预处理出 $pt_{i, S}$ 表示让一个不属于 集合 $S$ 的 点$i$ 与点集 $S$ ...

  4. $[NOIp2017]$ 宝藏 状压$dp$

    \(Sol\) 觉得这里是个很巧妙的地方吖,就是记下当前扩展点集的最大深度,然后强制下一步扩展的点集都是最大深度+1.这样做在当前看可能会导致误算答案导致答案偏大,但是整个\(dp\)完成后一定可以得 ...

  5. Luogu3959 NOIP2017 宝藏 状压DP

    题目传送门:https://www.luogu.org/problemnew/show/P3959 题意:给出一个有$N$个点的图,求其中的一个生成树(指定一个点为根),使得$\sum\limits_ ...

  6. P3959 宝藏 状压dp

    之前写了一份此题关于模拟退火的方法,现在来补充一下状压dp的方法. 其实直接在dfs中状压比较好想,而且实现也很简单,但是网上有人说这种方法是错的...并不知道哪错了,但是就不写了,找了一个正解. 正 ...

  7. [Luogu P3959] 宝藏 (状压DP+枚举子集)

    题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...

  8. NOIp2017D2T2(luogu3959) 宝藏 (状压dp)

    时隔多年终于把这道题锅过了 数据范围显然用搜索剪枝状压dp. 可以记还有哪些点没到(或者已到了哪些点).我们最深已到的是哪些点.这些点的深度是多少,然后一层一层地往下推. 但其实是没必要记最深的那一层 ...

  9. 计蒜客 宝藏 (状压DP)

    链接 : Here! 思路 : 状压DP. 开始想直接爆搜, T掉了, 然后就采用了状压DP的方法来做. 定义$f[S]$为集合$S$的最小代价, $dis[i]$则记录第$i$个点的"深度 ...

  10. loj2318 「NOIP2017」宝藏[状压DP]

    附带其他做法参考:随机化(模拟退火.爬山等等等)配合搜索剪枝食用. 首先题意相当于在图上找一颗生成树并确定根,使得每个点与父亲的连边的权乘以各自深度的总和最小.即$\sum\limits_{i}dep ...

随机推荐

  1. js 常用处理

    判断浏览器环境是PC端还是手机端 function goPAGE() { if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios| ...

  2. 【Python】第一个爬虫

    import urllib.request import re class DownPic: def __init__(self,url,re_str): self.url = url self.re ...

  3. R in action读书笔记(13)第十章 功效分析

    功效分析 功效分析可以帮助在给定置信度的情况下,判断检测到给定效应值时所需的样本量.反过来,它也可以帮助你在给定置信度水平情况下,计算在某样本量内能检测到给定效应值的概率.如果概率低得难以接受,修改或 ...

  4. 洛谷 P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…

    题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row and numbered 1..N. The cow ...

  5. 解剖嵌入式设备开发时以SD卡启动时SD卡的存储结构(以三星exynos4412为例)

    目前面对高性能产品的嵌入式开发中,用SD卡来代替以往的JLINK显得备受大家喜欢,而且MCU厂家也对以SD卡启动的支持度越来越大,反而对JLINK不在那么重视(不过依旧保留着).一些以开发开发板的公司 ...

  6. 迅为7寸Android嵌入式安卓触摸屏,工业一体机方案

    嵌入式安卓触摸屏板卡介绍-工业级核心板: 嵌入式安卓触摸屏功能接口介绍: 品质保障: 核心板连接器:进口连接器,牢固耐用,国产连接器无法比拟(为保证用户自行设计的产品品质,购买核心板用户可免费赠送底板 ...

  7. AIX 10201 ASM RAC安装+升级到10204

    1:查看系统版本 [rac1:root:/hacmp/hacmp5.4/ha5.4/installp/ppc] oslevel -s 6100-06-06-1140 lslpp -al bos.adt ...

  8. ALTER SCHEMA - 修改一个模式的定义

    SYNOPSIS ALTER SCHEMA name RENAME TO newname DESCRIPTION 描述 ALTER SCHEMA 修改一个模式的定义. 现在它唯一的功能就是重命名模式. ...

  9. zabbix4.2学习笔记--zabbix安装

    环境 系统信息 发行版 版本 ip 关系 主机名 centos 7.5 192.168.181.135 服务端 server centos 7.5 192.168.181.136 客户端 client ...

  10. JS 水印图片合成实例页面

    CSS代码: .clip { position: absolute; clip: rect(0 0 0 0); } HTML代码: <input type="file" id ...