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的更多相关文章

  1. [luogu]P3959 宝藏[NOIP][状态压缩DP]

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

  2. [Luogu P3959] 宝藏 (状压DP+枚举子集)

    题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...

  3. 【luogu P3959 宝藏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...

  4. Luogu P3959 宝藏

    这道题正解是状压DP,不过我不会所以写一下随机化算法来骗骗分. 听说当时考场上就有很多写prim然后挂掉的神仙,其实这道题是可以prim过的 prim是一种基于贪心的算法,在本题中由于盲目的选择当前最 ...

  5. 题解 Luogu P3959 【宝藏】

    来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状 ...

  6. Luogu P3959 [NOIP2017]宝藏

    题目 STO rqy OTZ 首先这种题一看我们就知道可以爆搜. prim一眼假了,但是加个SA也能过. 所以我们来写状压. 记\(f_{i,j,S}\)表示起点到\(j\)距离为\(i\),我们现在 ...

  7. 【题解】Luogu P5313 僕たちはひとつの光([Ynoi2012]D2T2)

    原题传送门 lovelive好评 比赛时只拿到了60pts,还是自己太菜了 这题的思想实际有点像Luogu P3674 小清新人渣的本愿与Luogu P5071 [Ynoi2015]此时此刻的光辉 这 ...

  8. LOJ P3959 宝藏 状压dp noip

    https://www.luogu.org/problemnew/show/P3959 考场上我怎么想不出来这么写的,状压白学了. 直接按层次存因为如果某个点在前面存过了则肯定结果更优所以不用在意各点 ...

  9. 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)

    洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ...

随机推荐

  1. BOM:浏览器对象

    1.window是javascript的顶级对象        window有很多内置方法 如 alert open 自定义函数 2.window是bom的顶级对象,通常情况下,可以省略 window ...

  2. TypeScript 技巧

    前言 很早以前就尝试过使用 TypeScript 来进行日常编码,但自己对静态类型语言的了解并不深入,再加上 TypeScript 的类型系统有着一定的复杂度,因此感觉自己并没有发挥好这门语言的优势, ...

  3. CSS子元素在父元素中水平垂直居中的几种方法

    1. 水平居中(margin: auto;)子父元素宽度固定,子元素上设置 margin: auto; 子元素不能设置浮动,否则居中失效. #div1{ width: 300px; height: 3 ...

  4. moveDown()

    这里在判断边界时,判断的是 y == HEIGHT - 1. void moveDown(){ //定义变量存放人物下方的坐标 int dx, dy; //当下方没有元素时,直接return if(y ...

  5. 【Docker】docker 的常用命令&操作

    一.在linux虚拟机上安装docker XShell1:检查内核版本,必须是3.10及以上 uname -r2:安装docker yum install docker3:输入y确认安装4:启动doc ...

  6. shell [ ] 和 [[ ]] 区别

    [参考文章]:shell if [[ ]]和[ ]区别 || && [参考文章]:Shell test 命令 1. [ ] 和 test test  等同于 [ ] 可用于判断某个条件 ...

  7. OUC_Summer Training_ DIV2_#12(DP1) 723

    这一次是做练习,主要了解了两个算法,最大子矩阵和,最长上升子序列. 先看题好啦. A - To The Max Time Limit:1000MS     Memory Limit:32768KB   ...

  8. how to force git to overwritten local files

    最佳解决方法 重要提示:如果您有任何本地更改,将会丢失.无论是否有--hard选项,任何未被推送的本地提交都将丢失. 如果您有任何未被Git跟踪的文件(例如上传的用户内容),这些文件将不会受到影响. ...

  9. 初写C#的小总结

    虽然大学学过很多计算机语言,但是现在工作是前端,一个刚入行的前端菜鸟,之前对于后台完全零接触,但是最近有个项目,我也是第一次真正接触C#,中间遇到了一些小问题,就做个总结记录下,真的是超级简单的小知识 ...

  10. Django运行项目时候出现DisallowedHost at / Invalid HTTP_HOST header:

    web端错误现象: DisallowedHost at / Invalid HTTP_HOST header: 'ip:8000'. You may need to add u'ip' to ALLO ...