[luogu]P3959 宝藏[NOIP][状态压缩DP]
宝藏【TREASURE】
题目描述
参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度。
小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋距离地面都很远, 也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路 则相对容易很多。
小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某 个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。
在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。已经开凿出的道路可以 任意通行不消耗代价。每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路 所能到达的宝藏屋的宝藏。另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏 屋之间的道路无需再开发。
新开发一条道路的代价是:
L×K
L代表这条道路的长度,K代表从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的 宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋) 。
请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代 价最小,并输出这个最小值。
输入输出格式
输入格式:
第一行两个用空格分离的正整数 n 和 m,代表宝藏屋的个数和道路数。
接下来 m 行,每行三个用空格分离的正整数,分别是由一条道路连接的两个宝藏 屋的编号(编号为 1~n),和这条道路的长度 v。
输出格式:
输出共一行,一个正整数,表示最小的总代价。
输入输出样例
输入样例1#:
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 1
输出样例1#:
4
输入样例2#:
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 2
输出样例2#:
5
【样例解释1】
小明选定让赞助商打通了 1 号宝藏屋。小明开发了道路 1 \to 21→2,挖掘了 2 号宝 藏。开发了道路 1 \to 41→4,挖掘了 4 号宝藏。还开发了道路 4 \to 34→3,挖掘了 3 号宝 藏。工程总代价为:1 \times 1 + 1 \times 1 + 1 \times 2 = 4 1×1+1×1+1×2=4
【样例解释2】
小明选定让赞助商打通了 1 号宝藏屋。小明开发了道路 1 \to 21→2,挖掘了 2 号宝 藏。开发了道路 1 \to 31→3,挖掘了 3 号宝藏。还开发了道路 1 \to 41→4,挖掘了 4 号宝 藏。工程总代价为:1 \times 1 + 3 \times 1 + 1 \times 1 = 51×1+3×1+1×1=5
【数据规模与约定】
对于 20%的数据:保证输入是一棵树,1≤n≤8,v≤5000 且所有的 v 都相等。
对于 40%的数据:1≤n≤8,0≤m≤1000,v≤5000 且所有的 v 都相等。
对于 70%的数据:1≤n≤8,0≤m≤1000,v≤5000
对于 100%的数据:1≤n≤12,0≤m≤1000,v≤500000
数据很小,状压DP。
用f[i][s]表示s状态下,最深的为i的方案的最优解。
转移:f[i][s|t]=Min{f[i-1][s]+v*(i-1)}
v*i为转移代价,t为s的补集的子集(需要一些点作为下一层)。
注意点:
<i>枚举子集,for(t=U;t;t=U&(t-1)),在后面逐个删0,最前面1被删除后换下一个。[这个要自己体会啦,别人说不清楚]
<ii>预处理v的代价,枚举s,对于每一个s,把一个点加入s的最小代价预处理以提高效率。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline int read();
int Min(int x,int y){return x<y?x:y;}
namespace lys{
;
int n,m,ans;
][<<],d[],e[][];
int main(){
int i,j,S,U,t,u,v,w;
n=read(); m=read();
;i<n;i++) ;j<n;j++) e[i][j]=inf;
;i<=n;i++) ;j<(<<n);j++) dp[i][j]=inf;
;i<n;i++) dp[][<<i]=;
;i<=m;i++){
u=read(); v=read(); w=read();
e[u-][v-]=e[v-][u-]=Min(e[u-][v-],w);
}
;S<(<<n);S++){
;i<n;i++){
d[i]=inf;
;j<n;j++) ) d[i]=Min(d[i],e[i][j]);
}
<<n)-),t=U;t;t=U&(t-)){
v=;
;i<n;i++) ){
v+=d[i];
if(v>=inf) break ;
}
;i<=n;i++) dp[i][S|t]=Min(dp[i][S|t],dp[i-][S]+(i-)*v);
}
}
ans=inf;
;i<=n;i++) ans=Min(ans,dp[i][(<<n)-]);
printf("%d\n",ans);
;
}
}
int main(){
lys::main();
;
}
inline int read(){
,ff=;
char c=getchar();
'){
;
c=getchar();
}
+c-',c=getchar();
return kk*ff;
}
[luogu]P3959 宝藏[NOIP][状态压缩DP]的更多相关文章
- NOIP 2017 P3959 宝藏 (状态压缩DP板子)
洛谷题目传送门!! 题目的N这么小,当然是选择用状压DP啦! 等等,我好像不会状缩.... 首先,我们当然是要写状态转移方程了!! 那么,如果我们设 f[s] 状态s下,所要的最小花费,那么很显 ...
- [Luogu P3959] 宝藏 (状压DP+枚举子集)
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...
- luogu P2704 炮兵阵地(经典状态压缩DP)
方格有m*n个格子,一共有2^(m+n)种排列,很显然不能使用暴力法,因而选用动态规划求解. 求解DP问题一般有3步,即定义出一个状态 求出状态转移方程 再用算法实现.多数DP题难youguan点在于 ...
- 最短路+状态压缩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
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
随机推荐
- python 并发编程 多路复用IO模型
多路复用IO(IO multiplexing) 这种IO方式为事件驱动IO(event driven IO). 我们都知道,select/epoll的好处就在于单个进程process就可以同时处理多个 ...
- kubernetes集群node加入不了master错误处理
#如果node加入不了master或者加入成功但是,在master中显示不出来.排查错误:1. 运行,kubelet, 查看日志,一般是kubelet的运行和docker启动方式不匹配.调整:vim ...
- hdoj4507(数位dp)
题目链接:https://vjudge.net/problem/HDU-4507 题意:定义如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关—— 1.整数中某一位是7: 2.整数的每一位 ...
- 利用BFS解决拯救007问题 -- 数据结构
题目: 7-1 拯救007 (30 分) 在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接 ...
- 32、出任爬虫公司CEO(爬取职友网招聘信息)
职友集,搜索到全国上百家招聘网站的最新职位. https://www.jobui.com/rank/company/ 打开网址后,你会发现:这是职友集网站的地区企业排行榜,里面含有 本 ...
- react-native底部导航栏实现
react-native-tab-navigator实现: bottom.js代码如下: import React, {Component} from 'react'; import {StyleSh ...
- HTTP 缓存简单了解
HTTP 缓存简单了解.文章整理了相关资料,记录了部分实践.方便大家轻松了解缓存.能回答上三个问题,HTTP缓存就算理解呢.能否缓存?缓存是否过期?协商缓存? 概要: web缓存 缓存的处理 前端解决 ...
- kali下纯文本与窗口环境切换
切到纯文本环境,想返回 试了半天ctrl+alt+f7不行, 最后我想试试ctrl+alt+f8竟然成了: 而且那是之前以root账户登录图像界面时切换回去是f8,普通用户是f9 ,为何如此,我还不 ...
- Delphi 对象观察器
- Nginx Windows下安装使用及权重分配
内容目录 Nginx 下载启动Nginx关闭NginxNginx使用注意事项使用Nginx代理服务器做负载均衡Nginx配置静态资源Nginx权重分配方式Nginx负载均衡参数描述写在最后 Nginx ...