luogu P3959(2017noipTG D2T2
luogu P3959(2017noipTG D2T2
不知道为什么,这两天见了好多伪装成图的dp题,这道也是.
最短路只有40分,实际上可以从数据范围n<=12看出来是状压dp.
solution:
题意就是找到一种连接方法,使这些点在同一连通块中且代价最小.
因为n<=12,所以dfs+状压dp去做.
具体操作见注释.
AC码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int n,m,cnt,out[15],k,ans=1e9+7,E[15][15],dp[15][15][1<<15];
//dp[x][d][s] 点x在集合s中深度为d时的最小总代价
//目标状态为cnt==(1<<n)-1
//out[i]为层数 void work(int x,int sum,int deep)
{
//转移方程为dp[x][deep][1<<(x-1)]=min(dp[x][deep][1<<(x-1)],sum+out[i]*E[i][j])
//sum为上一层dp时的最优解,deep为层数,x为当前的集合
if(sum>=ans) return ;//剪 枝
if(x==cnt)
{
ans=sum;
return ;
}
for(int i=1;i<=n;i++)
{
if(!(1<<(i-1)&x)) continue ;
for(int j=1;j<=n;j++)
{
if(!((1<<(j-1))&x)&&E[i][j]<1e9+7)
{
if(dp[j][deep+1][1<<(j-1)|x]<=sum+out[i]*E[i][j]) continue;
dp[j][deep+1][1<<(j-1)|x]=sum+out[i]*E[i][j];
out[j]=out[i]+1;
work(1<<(j-1)|x,dp[j][deep+1][1<<(j-1)|x],deep+1);
}
}
}
} int main()
{
scanf("%d%d",&n,&m);
cnt=(1<<n)-1;
memset(E,0x3f,sizeof(E));
while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
E[u][v]=E[v][u]=min(E[u][v],w);
// add(u,v,w);add(v,u,w);
// in[u]++;in[v]++;
// out[u]++;out[v]++;
// if(out[u]>out[v]&&out[u]>out[maxu]) maxu=u;
// if(out[v]>out[u]&&out[v]>out[maxu]) maxu=v;
// maxout=max(maxout,max(out[u],out[v]));
}
for(int i=1;i<=n;i++)
{
memset(out,0,sizeof(out));
memset(dp,0x3f,sizeof(dp));
out[i]=1;
//初始化
work(1<<(i-1),0,0);
}
printf("%d\n",ans);
return 0;
}
状压dp复习:
个人认为状压最重要的就是位运算,通常情况下状压都是采用二进制压缩的(听说有三进制的,但是太菜不会)
一张关于位运算操作的图(网上找的

十分感谢 ___new2zy___dalao的博客,这是链接.
然后就想说一下如何选择状压dp的问题.(个人经验
通常情况下n不会超过64,一般对于每个点(步骤)存在两种情况,如:选or不选,输or赢.
其余的性质和普通dp一样(无后效性,最优,阶段)
luogu P3959(2017noipTG D2T2的更多相关文章
- [luogu]P3959 宝藏[NOIP][状态压缩DP]
[luogu]P3959 宝藏[TREASURE] 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的 ...
- [Luogu P3959] 宝藏 (状压DP+枚举子集)
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...
- 【luogu P3959 宝藏】 题解
题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...
- Luogu P3959 宝藏
这道题正解是状压DP,不过我不会所以写一下随机化算法来骗骗分. 听说当时考场上就有很多写prim然后挂掉的神仙,其实这道题是可以prim过的 prim是一种基于贪心的算法,在本题中由于盲目的选择当前最 ...
- 题解 Luogu P3959 【宝藏】
来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状 ...
- Luogu P3959 [NOIP2017]宝藏
题目 STO rqy OTZ 首先这种题一看我们就知道可以爆搜. prim一眼假了,但是加个SA也能过. 所以我们来写状压. 记\(f_{i,j,S}\)表示起点到\(j\)距离为\(i\),我们现在 ...
- 【题解】Luogu P5313 僕たちはひとつの光([Ynoi2012]D2T2)
原题传送门 lovelive好评 比赛时只拿到了60pts,还是自己太菜了 这题的思想实际有点像Luogu P3674 小清新人渣的本愿与Luogu P5071 [Ynoi2015]此时此刻的光辉 这 ...
- LOJ P3959 宝藏 状压dp noip
https://www.luogu.org/problemnew/show/P3959 考场上我怎么想不出来这么写的,状压白学了. 直接按层次存因为如果某个点在前面存过了则肯定结果更优所以不用在意各点 ...
- 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)
洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ...
随机推荐
- mybatis集成spring
1.为什么mybatis要去集成spring?===>简单来说就是为了让spring 来帮我们管理事务!!如果没有spring去帮助管理事务,那么需要我们自己去手动去维护事务,例如:发生异常需要 ...
- 第十四周课程总结&实验报告(简单记事本的实现)
1.JDBC概述 JDBC提供了一种与平台无关的用于执行SQL语句的标准JavaAPI,可以方便的实现多种关系型数据库的统一操作,它由一组用Java语言编写的类和接口组成 主要常用操作类与接口: ja ...
- ubuntu 14.04 升级到18.04
http://www.360doc.com/content/18/0929/09/35082563_790606785.shtml
- Nginx作为静态资源web服务-跨站访问
一.跨域访问 1.什么是跨域? 参看我的另一篇博客(https://www.cnblogs.com/chrdai/p/11280895.html) 2.为什么浏览器禁止跨域访问? 不安全,容易出现CS ...
- VSCode查询快捷键对应功能技巧
- LC 835. Image Overlap
Two images A and B are given, represented as binary, square matrices of the same size. (A binary ma ...
- LC 275. H-Index II
Given an array of citations sorted in ascending order (each citation is a non-negative integer) of a ...
- 自定义nagios监控脚本---磁盘检测
自定义nagios监控脚本---磁盘检测 1. 在客户端上创建脚本/usr/local/nagios/libexec/check_disk.shvim /usr/local/nagios/libexe ...
- Qt编写自定义控件18-魔法小鱼
前言 上次发了个纯painter绘制的老鼠,那个就是qt目录下的demo,改的,只是比demo中的老鼠稍微胖一点,估计人到中年都发福吧.这次来一个魔法小鱼,这条鱼可以变换颜色,尾巴还会摇动,可以设定旋 ...
- unmix和conditional average:消混叠和条件均值
unmix 该程序用来消除“像素混叠”.所谓像素混叠,是值在自然场景的图像中,边缘线成像到cmos的像素上时,某些像素会刚好跨在该边缘线上. 这样的像素特点就是,其R.G.B三色像素梯度值不一致.比如 ...