题目: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. READING | 我是一只IT小小鸟

    “世界是如此的熙熙攘攘,让年轻的心找不到方向,但这些人是不能小看的啊,如果他们开始敲打自己的命令行.” “知之者不如好知者,好之者不如乐之者”,很多IT界的优秀人才都对计算机技术或者IT技术有着浓厚的 ...

  2. 【树剖】CF916E Jamie and Tree

    好吧这其实应该不是树剖... 因为只要求子树就够了,dfs就好了 大概就是记录一个全局根root 多画几幅图会发现修改时x,y以root为根时的lca为以1为根时的lca(x,y),lca(root, ...

  3. Android开发 控件阴影详情

    如何给控件设置阴影? <com.google.android.material.tabs.TabLayout android:id="@+id/tablayout" andr ...

  4. IDEA将代码推送至远程GitHub仓库

    1 在项目根路径下添加.gitignore文件 2 创建本地git仓库 3 git add操作 快捷键 ctrl+alt+a 4 git commit操作 快捷键ctrl+k 5 git push操作 ...

  5. 根据table返回来的数据,动态展示组织名称

    <template> <div class="app-container calendar-list-container"> <el-card cla ...

  6. [JZOJ4913] 【GDOI2017模拟12.3】告别

    题目 描述 题目大意 给你两个排列AAA和BBB,每次随即选三个数进行轮换操作,问mmm次操作内使AAA变成BBB的概率. 思考历程 首先随便搞一下,就变成了AAA中每个数回归自己原位. 一眼望去,感 ...

  7. 【JZOJ3397】【luoguP4556】雨天的尾巴

    description 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连 ...

  8. Docker配置JDK1.8

    1.安装Docker(菜鸟教程有) https://www.runoob.com/docker/centos-docker-install.html 2.docker下载centos镜像(用作配置jd ...

  9. vuex结合vue-cookies的使用

    一.创建vuex import Vue from 'vue' import Vuex from 'vuex' import cookie from "vue-cookies" Vu ...

  10. C++ 函数模板&类模板详解

    在 C++ 中,模板分为函数模板和类模板两种.函数模板是用于生成函数的,类模板则是用于生成类的. 函数模板&模板函数     类模板&模板类  必须区分概念 函数模板是模板,模板函数时 ...