题目:https://www.luogu.org/problemnew/show/P3959

原来写了个不枚举起点的状压dp。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,M=(<<)+,INF=0x3f3f3f3f;
int n,m,lm,b[N][N],dis[M][N];
ll dp[M];
int main()
{
scanf("%d%d",&n,&m);lm=(<<n);
memset(b,0x3f,sizeof b);
int x,y,z;
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
b[x][y]=min(b[x][y],z);b[y][x]=b[x][y];
}
memset(dp,0x3f,sizeof dp);dp[]=;
for(int i=;i<=n;i++)dp[<<(i-)]=,dis[<<(i-)][i]=;
for(int s=;s<lm;s++)
for(int i=;i<=n;i++) if((s&(<<(i-)))==)
{
int d=(s|(<<(i-)));
for(int j=;j<=n;j++) if(s&(<<(j-)))
if(dp[s]+(ll)b[i][j]*dis[s][j]<dp[d])//b可能是0x3f3f3f
{
dp[d]=dp[s]+(ll)b[i][j]*dis[s][j];
memcpy(dis[d],dis[s],sizeof dis[s]);
dis[d][i]=dis[s][j]+;
}
}
printf("%lld\n",dp[lm-]);
return ;
}

但其错误是不能改dis。没有最优子结构的性质。

然后看了题解,发现如果枚举起点,就行了。

其实和原来想的差不多,但原来的不同起点的dis最后会混到一起,进而少遍历一些状态。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,M=(<<)+,INF=0x3f3f3f3f;
int n,m,lm,b[N][N],dis[N];
ll dp[M],ans=INF;
void dfs(int S)
{
for(int i=;i<=n;i++) if((S&(<<(i-)))==)
{
int D=(S|(<<(i-)));
for(int j=;j<=n;j++) if(S&(<<(j-))&&b[i][j]<INF)
if(dp[S]+b[i][j]*dis[j]<dp[D])
{
dp[D]=dp[S]+b[i][j]*dis[j];
dis[i]=dis[j]+;
dfs(D);
dis[i]=;
}
}
}
int main()
{
scanf("%d%d",&n,&m);lm=(<<n);
memset(b,0x3f,sizeof b);
int x,y,z;
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
b[x][y]=min(b[x][y],z);b[y][x]=b[x][y];
}
for(int i=;i<=n;i++)
{
memset(dp,0x3f,sizeof dp);dp[<<(i-)]=;
memset(dis,0x3f,sizeof dis);dis[i]=;
dfs(<<(i-));
ans=min(ans,dp[lm-]);
}
printf("%lld\n",ans);
return ;
}

洛谷 3959 宝藏——枚举+状压dp的更多相关文章

  1. 洛谷P3959 宝藏(状压dp)

    传送门 为什么感觉状压dp都好玄学……FlashHu大佬太强啦…… 设$f_{i,j}$表示当前选的点集为$i$,下一次要加入的点集为$j$时,新加入的点和原有的点之间的最小边权.具体的转移可以枚举$ ...

  2. 洛谷 P3959 宝藏【状压dp】

    一开始状态设计错了-- 设f[i][s]为当前与根节点联通状况为s,最深深度为i 转移的话枚举当前没有和根联通的点集,预处理出把这些点加进联通块的代价(枚举s中的点和当前点的连边乘以i即可),然后用没 ...

  3. 【洛谷4941】War2 状压Dp

    简单的状压DP,和NOIP2017 Day2 找宝藏 代码几乎一样.(比那个稍微简单一点) f[i][j] ,i代表点的状态,j是当前选择的点,枚举上一个选到的点k 然后从f[i-(1<< ...

  4. 洛谷 P1433 吃奶酪 状压DP

    题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ...

  5. 洛谷 P3112 后卫马克 —— 状压DP

    题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ...

  6. 2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)

    传送门 状压一眼题. 直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数. 然后考虑现在怎么转移. 显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n2 ...

  7. 洛谷P2473奖励关——状压DP

    题目:https://www.luogu.org/problemnew/show/P2473 还是对DP套路不熟悉... 像这种前面影响后面,而后面不影响前面的问题就应该考虑倒序递推: 看n只有15那 ...

  8. 洛谷P4590 [TJOI2018]游园会(状压dp LCS)

    题意 题目链接 Sol 这个题可能是TJOI2018唯一的非模板题了吧.. 考虑LCS的转移方程, \[f[i][j] = max(f[i - 1][j], f[i][j - 1], f[i - 1] ...

  9. 洛谷 P1879 玉米田(状压DP入门题)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int M,N; int plant[maxn][maxn];/ ...

随机推荐

  1. JPA默认方法查询遇到转JSON的处理

    JPA提供的findAll等查询方法在有关联的对象时 比如:在查userInfo @Entity@Table(name = "user_info")public class Use ...

  2. (转)nginx配置location总结及rewrite规则写法

    注: rewrite 只能对域名后边的除去传递的参数外的字符串起作用,并且要写全域名后面的部分,如: http://i.com:9090/php/midou/admin.php/index/login ...

  3. React require(“history”).createBrowserHistory` instead of `require(“history/createBrowserHistory”)

    看见bug惊讶,代码中并没有require("history/createBrowserHistory") //原有代码为 import createBrowserHistory ...

  4. python类的静态方法和类方法区别

    先看语法,python 类语法中有三种方法,实例方法,静态方法,类方法. # coding:utf-8 class Foo(object): """类三种方法语法形式&q ...

  5. 日志服务与SIEM(如Splunk)集成方案实战

    背景信息 目标 本文主要介绍如何让阿里云日志服务与您的SIEM方案(如Splunk)对接, 以便确保阿里云上的所有法规.审计.与其他相关日志能够导入到您的安全运维中心(SOC)中. 名词解释 LOG( ...

  6. SQLite C++操作类

    为了方便SQLite的使用,封装了一个SQLite的C++类,同时支持ANSI 和UNICODE编码.代码如下:   头文件(SQLite.h) [cpp] view plaincopy /***** ...

  7. go语言基本运算符

    go语言基本运算符 1.算术运算符 以下假设A=10,B=20: 2.关系运算符 以下假设A=10,B=20: 3.逻辑运算符 以下假设A=true,B=false: 4.位运算符 十进制转二进制: ...

  8. vue如何关闭sourceMap

    Vue打包后出现一些map文件的解决办法: 问题: 可能很多人在做vue项目打包,打包之后js中,会自动生成一些map文件,那我们怎么把它去掉不要呢? 1,运行  cnpm run build  开始 ...

  9. java线程池的使用学习

    目录 1. 线程池的创建 2. 线程池的运行规则 3. 线程池的关闭 4. 线程池的使用场合 5. 线程池大小的设置 6 实现举例 1. 线程池的创建 线程池的创建使用ThreadPoolExecut ...

  10. c#设置文件及文件夹的属性

    c#中通过FileAttributes枚举来设置文件或文件夹的属性. FileAttributes 枚举 成员名称 说明 Archive 文件的存档状态.应用程序使用此属性为文件加上备份或移除标记. ...