洛谷题目传送门!!

题目的N这么小,当然是选择用状压DP啦!  等等,我好像不会状缩。。。。

首先,我们当然是要写状态转移方程了!!

那么,如果我们设  f[s]  状态s下,所要的最小花费,那么很显然有状态转移方程:

(s为总集合)

f[(1 << j) | s] =  f[s] + num[i] * dis[i][j]  (从 i 点走向 j点时)

其中,num表示之前已经走过的点的数量,dis表示从i到j的边的距离(这不就是题目要求吗)

很显然,这道题用DFS来做比较方便(跑图和回溯)

等等。

如果我们用不同的走法更新到同一个点,那么是否会影响到我们的更新呢? 显然是会的。

就比如,我们   1 -› 2 -› 3 -› 4  和 1 -›  3  -› 5 -› 2 - › 4  ,两种走法下,num的不同显然会给我们的更新带来不同的影响。

所以,上面的DP走法是有后效性的。

于是,我们要更新DP方程:

f[1 << j | s] = min( best + num[i] * dis[i][j]) , 其中 best 为上一层的最优解。

注意,起点不确定,怎么办?   当然是枚举起点啦!

#include <bits/stdc++.h>
using namespace std;
#define N 13
#define isdigit(c) ((c)>='0'&&(c)<='9')
#define min(a,b) ((a)<(b)?(a):(b)) inline int read(){
int x = , s = ;
char c = getchar();
while(!isdigit(c)){
if(c == '-')s = -;
c = getchar();
}
while(isdigit(c)){
x = (x << ) + (x << ) + (c ^ '');
c = getchar();
}
return x * s;
} int f[N][ << N][N];
int num[N], dis[N][N];
int n, m, limit;
int ans = (int)2e9; /*
状态转移方程:
对于当前的这个点j,如果他处在第 deth 层, 从第i号点转移到 j 则有
f[j][1 << j | s][deth] = best + num[i] * dis[i][j]
best 表示上一层最优解,dis表示i和j之间的距离
*/ void dfs(int s, int best, int deth){
if(best >= ans) return ; /*剪枝*/
if(s == limit) {
ans = min(ans, best); /*已经走完所有点*/
return ;
}
for(int i = ;i < n; i++){
if(!( << i & s)) continue; /*这个点还未走过,不能转移*/
for(int j = ;j < n; j++){
if(!( << j & s) && dis[i][j] < (int)2e9){
if(f[j][ << j | s][deth + ] > best + num[i] * dis[i][j]){
f[j][ << j | s][deth + ] = best + num[i] * dis[i][j]; /*进行转移*/
num[j] = num[i] + ; /*deth + 1, 因为j在i的下一层*/
dfs( << j | s, f[j][ << j | s][deth + ], deth + );
}
}
}
}
return ;
} int main(){
memset(dis, , sizeof(dis));
n = read(), m = read();
limit = ( << n) - ;
for(int i = ;i <= m; i++){
int x = read() - , y = read() - , w = read(); /*编号减一, 给状压用(2 ^ 0 才是 1)*/
dis[x][y] = dis[y][x] = min(dis[x][y], w);
}
for(int i = ;i < n; i++){
memset(num, , sizeof(num));
memset(f, , sizeof(f));
num[i] = ;
dfs( << i, , ); /*1 << i 把第i位设为 1*/
}
printf("%d\n", ans);
return ;
}

NOIP 2017 P3959 宝藏 (状态压缩DP板子)的更多相关文章

  1. 『宝藏 状态压缩DP NOIP2017』

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

  2. 状态压缩dp(hdu2167,poj2411)

    hdu2167 http://acm.hdu.edu.cn/showproblem.php?pid=2167 给定一个N*N的板子,里面有N*N个数字,选中一些数字,使得和最大 要求任意两个选中的数字 ...

  3. 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...

  4. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  5. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  6. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  7. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  8. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  9. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

随机推荐

  1. 树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463

    B - Strategic game POJ - 1463   题目大意:给你一棵树,让你放最少的东西来覆盖所有的边   这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处 ...

  2. 补一下昨天的博客 J - Sabotage 网络流

    题目链接:https://vjudge.net/contest/299467#problem/J 这个题目是一个裸的最小割问题,就不多赘述了. #include <cstdio> #inc ...

  3. 2249: Altruistic Amphibians 01背包的应用 + lh的简单图论 图转树求lca

    第一个 写了两个比较简单的数论题目,就是整除理论的两个题目,第一个题目比较蠢,第二个稍微要动一点脑筋 Codeforces Round #347 (Div. 2) – A. Complicated G ...

  4. Unity 游戏框架搭建 2019 (四十六) 简易消息机制 & 集成到 MonoBehaviourSimplify 里

    在上一篇,我们接触了单例,使用单例解决了我们脚本之间访问的问题. 脚本之间访问其实有更好的方式. 我们先分下脚本访问脚本的几种形式. 第一种,A GameObject 是 B GameObject 的 ...

  5. STM32 进行软件复位的方法

    platform:stm32f103xx include:core_cm3.h /** \brief System Reset \details Initiates a system reset re ...

  6. 单线程和多线程执行对比—Python多线程编程

    单线程和多线程执行对比 本章使用递归求斐波那契.阶乘与累加函数的执行来对比单线程与多线程: 斐波那契.阶乘与累加(mtfacfib.py): ​ import threading from time ...

  7. Mysql 常用函数(23)- sign 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html sign 的作用 返回参数的符号 sign 的语法 ...

  8. Docker之从零开始制作docker镜像

    以前学习docker是直接docker pull命令直接拉取Linux中已有镜像,并创建容器,添加应用程序,但是docker镜像一开始是怎么来的呢?下面将从零开始介绍整个docker镜像的制作过程(初 ...

  9. 基于 abp vNext 和 .NET Core 开发博客项目 - 数据访问和代码优先

    上一篇文章(https://www.cnblogs.com/meowv/p/12909558.html)完善了项目中的代码,接入了Swagger.本篇主要使用Entity Framework Core ...

  10. 快手4-5月Java岗面经

    快手面试准备 我的牛客网帖子链接:https://www.nowcoder.com/discuss/429362 一面: 基础知识 1.java基本数据类型(8种) 1.基本数据类型有哪些,各占多少位 ...