NOIP 2017 P3959 宝藏 (状态压缩DP板子)
题目的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板子)的更多相关文章
- 『宝藏 状态压缩DP NOIP2017』
宝藏(NOIP2017) Description 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的m 条道路和它们的长度. 小明决 ...
- 状态压缩dp(hdu2167,poj2411)
hdu2167 http://acm.hdu.edu.cn/showproblem.php?pid=2167 给定一个N*N的板子,里面有N*N个数字,选中一些数字,使得和最大 要求任意两个选中的数字 ...
- 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
随机推荐
- 图论--SCC强连通缩点--Tarjan
强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作. // Tarjan算法求有向图强连通分量并缩点 #include<iost ...
- 5分钟入门pandas
pandas是在数据处理.数据分析以及数据可视化上都有比较多的应用,这篇文章就来介绍一下pandas的入门.劳动节必须得劳动劳动 1. 基础用法 以下代码在jupyter中运行,Python 版本3. ...
- Android控件重叠显示小记
方案一 利用布局控件显示优先级 在xml中RelativeLayout,FrameLayout,靠后的控件显示在上层. 利用margin属性 margin属性可以控制控件间的距离,属性值为正值时,越大 ...
- ssrf爆破mysql
php ssrf 代码<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $_GET['url']); #curl_setopt($ch ...
- Java——Spring依赖配置详解
<properties> <junit.version>4.12</junit.version> <spring.version>4.3.9.RELEA ...
- Day_14【IO流】扩展案例1_缓冲区字符输入、输出流,键盘录入,contains()方法的统一运用
分析以下需求,并用代码实现 实现一个验证码小程序,要求如下: 1. 在项目根目录下新建一个文件:data.txt,键盘录入3个字符串验证码,并存入data.txt中,要求一个验证码占一行: 2. 键盘 ...
- Android 8.1 关机充电动画(三)Android模式
system:Android 8.1 platform:RK3326/PX30 uboot kernel system/core/healthd Android 8.1 关机充电动画(一)模式选择 A ...
- Git上传文件、文件夹到github
上传一个文件: $ git add test.txt 上传多个文件: $ git add test.txt demo.txt 同理: 上传一个文件夹: $ git add learngit 上传多个文 ...
- js代码中引入其他js文件
/***引入 js 文件 @example: import('js/aui.picker.js') @example: import(['js/aui.picker.js', 'css/aui.pic ...
- jbpm4.4 发送邮件
测了两天终于成功发送出邮件了,坑爹呢!原来一直用QQ邮箱发送,发现发送不了,提示要用ssl协议进行发送,后来换成了126邮箱,发送成功了!具体配置如下: jbpm定义文件 <?xml versi ...