题目分析:

这个做法不是最优的,想找最优解请关闭这篇博客。

首先容易想到用$f[i][S][j]$表示点$i$为根,考虑$S$这些点,$i$的深度为$j$情况的答案。

转移如下:

$f[i][S][j] = min(w(i,k)*(j+1)+f[k][S_0][j+1]+f[i][S-S_0][j])$ 其中$S != {i}$且$S_0 \subsetneqq S$且$k \in S_0$

$f[i][S][j] = 0$其中$S={i}$

这样已经可以通过了,时间复杂度是$O(n^3*3^n)$,原因是冗余状态太多。

但我们注意到对于每个集合我们都要遍历所有的为根的情况,用$g[i][S][j]$存储集合$S$中为根的最小值,可以优化到$O(n^2*3^n)$。

代码:

 #include<bits/stdc++.h>
using namespace std; int n,m; int g[][]; int f[][<<][],gi[][<<][]; void read(){
scanf("%d%d",&n,&m);
memset(g,0x3f,sizeof(g));
for(int i=;i<=m;i++){
int x,y,v; scanf("%d%d%d",&x,&y,&v);
if(g[x][y] > v) g[x][y] = g[y][x] = v;
}
} void paint(int now,int S,int j){
for(int i=;i<=n;i++){
if((<<i-)&S) continue;
gi[i][S][j] = min(1ll*gi[i][S][j],f[now][S][j]+1ll*g[now][i]*j);
}
} void work(){
memset(f,0x3f,sizeof(f));memset(gi,0x3f,sizeof(gi));
for(int i=n-;i>=;i--){
for(int j=;j<=n;j++){
f[j][<<j-][i] = ;
paint(j,<<j-,i);
}
for(int S=;S<(<<n);S++){
int zeta = __builtin_popcount(S);
if(zeta > n-i || zeta <= ) continue;
for(int k=;k<=n;k++){
if(!((<<k-)&S)) continue;
for(int S1 = S;S1;S1 = (S1-)&S){
f[k][S][i] = min(gi[k][S1][i+]+f[k][S-S1][i],f[k][S][i]);
}
paint(k,S,i);
}
}
}
int ans = ;
for(int i=;i<=n;i++){
ans = min(ans,f[i][(<<n)-][]);
}
printf("%d",ans);
} int main(){
read();
work();
return ;
}

[NOIP2017] 宝藏 【树形DP】【状压DP】的更多相关文章

  1. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

  2. 【NOIP2017】宝藏 题解(状压DP)

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

  3. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  4. hdu 4352 "XHXJ's LIS"(数位DP+状压DP+LIS)

    传送门 参考博文: [1]:http://www.voidcn.com/article/p-ehojgauy-ot.html 题解: 将数字num字符串化: 求[L,R]区间最长上升子序列长度为 K ...

  5. [转]状态压缩dp(状压dp)

    状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的 ...

  6. 状态压缩dp 状压dp 详解

    说到状压dp,一般和二进制少不了关系(还常和博弈论结合起来考,这个坑我挖了还没填qwq),二进制是个好东西啊,所以二进制的各种运算是前置知识,不了解的话走下面链接进百度百科 https://baike ...

  7. 洛谷 P3343 - [ZJOI2015]地震后的幻想乡(朴素状压 DP/状压 DP+微积分)

    题面传送门 鸽子 tzc 竟然来补题解了,奇迹奇迹( 神仙题 %%%%%%%%%%%% 解法 1: 首先一件很明显的事情是这个最小值可以通过类似 Kruskal 求最小生成树的方法求得.我们将所有边按 ...

  8. 51nod 1673 树有几多愁(链表维护树形DP+状压DP)

    题意 lyk有一棵树,它想给这棵树重标号. 重标号后,这棵树的所有叶子节点的值为它到根的路径上的编号最小的点的编号. 这棵树的烦恼值为所有叶子节点的值的乘积. lyk想让这棵树的烦恼值最大,你只需输出 ...

  9. bzoj4455 & loj2091 [Zjoi2016]小星星 容斥原理+树形DP(+状压DP?)

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4455 https://loj.ac/problem/2091 题解 很不错的一道题.(不过在当 ...

  10. BZOJ3836 [Poi2014]Tourism 【树形dp +状压dp】

    题目链接 BZOJ3836 题解 显然这是个\(NP\)完全问题,此题的解决全仗任意两点间不存在节点数超过10的简单路径的性质 这意味着什么呢? \(dfs\)树深度不超过\(10\) \(10\)很 ...

随机推荐

  1. RabbitMQ 3.6.1 升级至 3.7.9 版本(Windows 升级至Centos)

    随着公司业务量的增加,原本部署在Windows服务器的RabbitMQ集群(3.6.1)总是出现莫名其妙的问题,经查询官方Issue,确认是RabbitMQ 3.6.1 版本的bug.查看从3.6.1 ...

  2. 七、xadmin 编辑界面实现二级联动

    很多时候,我们会遇到这种需求,通过一个select框中选择的值,去动态的加载另一个下拉框中的内容 对于前端的同学来讲,这个本应该是一个很简单的需求,获取第一个下拉框的值然后通过ajax去动态加载即可. ...

  3. 整数划分 poj3181

    分析 因为n,m分别最大1000,100 所以结果会超过ll,要用两个来存大数的两部分 代码 #include<iostream> #include<algorithm> #i ...

  4. python学习第七篇——字典访问键与值

    此程序的目的在于,正确而简单的访问字典的键与值 favorite_languages={ 'jen':['python','c'], 'sarah':['c'], 'edward':['ruby',' ...

  5. Choosing The Commander CodeForces - 817E (01字典树+思维)

    As you might remember from the previous round, Vova is currently playing a strategic game known as R ...

  6. oc之证书

    https://www.cnblogs.com/MrJalen/p/6813309.html iOS推送证书生成pem文件(详细步骤)   1.pem文件概述 pem文件是服务器向苹果服务器做推送时候 ...

  7. 爬虫——selenium基础

    Selenium,自动化浏览器技术.主要用于web应用自动测试和自动完成web基本任务管理.官方网站:https://selenium-python.readthedocs.io/getting-st ...

  8. PHP中友好的处理方式

    在使用PHP进行开发的时候,由于PHP是弱类型语言的特性,所以,偶尔会遇到一些意想不到的错误.规范我们的编程就变得尤为重要了.下面总结一下,我日常开发中的一些经验,可能有些地方不妥,还请多多斧正,指教 ...

  9. ZJU_1145 OR POJ_1100 Dreisam Equations

    Dreisam Equations { 两个网站的题有点不一样(ZJH有特判)POJ时间卡得紧,建议去POJ过 } 题目大意: 给你一个字符串:是一个等式,等式左边是一个数,右边由若干个数和()构成, ...

  10. cmd远程连接oracle数据库