题面:[NOIP2017]宝藏

题面:

  首先我们观察到,如果直接DP,因为每次转移的代价受上一个状态到底选了哪些边的影响,因此无法直接转移。

  所以我们考虑分层DP,即每次强制现在加入的点的距离为k(可能实际上小于k),这样就可以忽略掉上个状态选了哪些边的影响了。

  所以这样为什么是正确的呢?

  设f[i][j]表示DP到第i层,状态为j的最小代价。(即每层离起点最远的点的距离为i - 1,所以下次转移的点距离为i)

  那么如果一个点被错误的计算了代价,当且仅当这个点离起点的距离小于i,但我们依然按照i的距离来计算了代价。

  那么可以证明,这个点一定会在正确的层数被计算一次(i之前的某一层),那么由于当前层数导致代价被多算,因此肯定没那么优,所以不会对答案造成影响。

  因此我们直接DP即可。

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 15
#define ac 12000
#define inf 2139062143
#define LL long long int n, m, maxn, ans = inf;
int f[AC][ac], in[AC], g[AC][AC], dis[ac][AC]; inline int read()
{
int x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} inline void upmin(int &a, int b){
if(b < a) a = b;
} void pre()
{
n = read(), m = read(), maxn = ( << n) - ;
memset(g, , sizeof(g));
for(R i = ; i <= m; i ++)
{
int a = read(), b = read(), c = read();
upmin(g[a][b], c), upmin(g[b][a], c);
}
int tmp = ;
for(R i = ; i <= n; i ++)
in[i] = tmp, tmp <<= , g[i][i] = ;
} void get()//获取所有联通块到各个点的距离,预处理可以降低复杂度
{
memset(dis, , sizeof(dis));
for(R k = ; k <= maxn; k ++)
{
for(R i = ; i <= n; i ++)//枚举集合内的一点
{
if(!(k & in[i])) continue;
for(R j = ; j <= n; j ++)
{
if(k & in[j]) dis[k][j] = ;
else upmin(dis[k][j], g[i][j]);
}
}
}
} void work()
{
memset(f, , sizeof(f));
for(R k = ; k <= n + ; k ++)//枚举当前层(走下一步的最远距离)
{
for(R i = ; i <= n; i ++) f[k][in[i]] = ;
upmin(ans, f[k][maxn]);
for(R i = ; i <= maxn; i ++)//枚举状态
{
if(f[k][i] == inf) continue;//不判断这个可能会爆int
int s = i ^ maxn;//获取补集
for(R j = s; j; j = (j - ) & s)//枚举补集的子集
{
int tmp = ;bool flag = true;
for(R l = ; l <= n; l ++)
{
if(!(j & in[l])) continue;//如果不在这个子集中就跳过
if(dis[i][l] == inf) {flag = false; break;}
tmp += k * dis[i][l];
}
if(flag) upmin(f[k + ][i | j], f[k][i] + tmp);
}
}
}
printf("%d\n", ans);
} int main()
{
// freopen("in.in", "r", stdin);
pre();
get();
work();
// fclose(stdin);
return ;
}

[NOIP2017]宝藏 子集DP的更多相关文章

  1. [NOIP2017]宝藏 状压DP

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

  2. NOIP2017宝藏 [搜索/状压dp]

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

  3. 【比赛】NOIP2017 宝藏

    这道题考试的时候就骗了部分分.其实一眼看过去,n范围12,就知道是状压,但是不知道怎么状压,想了5分钟想不出来就枪毙了状压,与AC再见了. 现在写的是状压搜索,其实算是哈希搜索,感觉状压DP理解不了啊 ...

  4. 【题解】NOIP2017逛公园(DP)

    [题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n​节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...

  5. [BZOJ4416][SHOI2013]阶乘字符串(子集DP)

    怎么也没想到是子集DP,想到了应该就没什么难度了. 首先n>21时必定为NO. g[i][j]表示位置i后的第一个字母j在哪个位置,n*21求出. f[S]表示S的所有全排列子序列出现的最后末尾 ...

  6. 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)

    「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...

  7. loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】

    题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} { ...

  8. hdu 5823 color II —— 子集DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5823 看博客:http://www.cnblogs.com/SilverNebula/p/5929550. ...

  9. BZOJ 4006 [JLOI2015]管道连接(斯坦纳树+子集DP)

    明显是一道斯坦纳树的题. 然而这题只需要属性相同的点互相连接. 我们还是照常先套路求出\(ans[s]\). 然后对\(ans[s]\)做子集DP即可. 具体看代码. #include<iost ...

随机推荐

  1. ACID、数据库隔离级别

    ACID: A(Atomicity):原子性,要么全部执行,要么都不执行 C(consistency):一致性: 特点: 1.一个操作除法级联,这些必须成功,否则全部失败(原子性) 2.所有节点同步更 ...

  2. 汽车VIN码识别/汽车车架号OCR识别,移动端VIN码识别,OCR扫描工具

    本文推荐了一项汽车VIN码自动识别技术,用户通过手机“扫一扫”的简单操作,就可以快速识别VIN码,查询到车辆的详细信息,为汽修汽配.二手车交易.车辆监管.查勘理赔提高工作效率. VIN是英文Vehic ...

  3. Micro:bit 硬件架构介绍

    Micro:bit做为当红的少儿编程工具,这两年在编程教育领域越来越火.今天就从硬件架构开始,分享Micro:bit的相关主题. Microbit 硬件设计是根据ARM mbed技术所开发的应用IC及 ...

  4. chorme打开网页的技巧

    恢复之前关闭的网页 ctr l+ shift + t 打开之前不小心关闭的网页 临时书签 在设置书签中有 为打开的网页添加书签 的选项, 清除地址栏搜索记录 首先需要退出个人谷歌账户,账户上的搜索记录 ...

  5. 文本分类-TextCNN

    简介 TextCNN模型是由 Yoon Kim提出的Convolutional Naural Networks for Sentence Classification一文中提出的使用卷积神经网络来处理 ...

  6. ElasticSearch 论坛搜索查询语句

    概述 研究论坛搜索如何综合时间和TF/IDF权重. 自定义权重计算的效率问题 数据结构 假设有一个论坛的搜索 字段包括: subject:标题 message:内容 dateline:发布时间 tag ...

  7. halcon基础应用和方法经验分享

    halcon基础应用和方法经验分享 一.Halcon软件 的安装 安装一直点下一步就好了,这个过程很简单,就不讲了 二.Halcon软件license安装 Halcon是商业视觉软件,是需要收费的,但 ...

  8. Windows下PATH等环境变量详解(转载)

    本文转载自http://legend2011.blog.51cto.com/3018495/553255 在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念, ...

  9. 自测之Lesson8:进程操作

    题目:请解释wait是如何同步父子进程的. 程序代码: #include <stdio.h> #include <unistd.h> #include <sys/type ...

  10. TCP系列13—重传—3、协议中RTO计算和RTO定时器维护

    从上一篇示例中我们可以看到在TCP中有一个重要的过程就是决定何时进行超时重传,也就是RTO的计算更新.由于网络状况可能会受到路由变化.网络负载等因素的影响,因此RTO也必须跟随网络状况动态更新.如果T ...