题目: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. JConsole&VisualVM监控总结

    简介JConsole(以下写作jconsole),VisualVM(以下写作jvisualvm ) 都是比较好的JVM调优工具,且都为JDK自带,可在命令行直接启动. 监控示例Server端(需要监控 ...

  2. JS规则 保持先后顺序(操作符优先级)操作符之间的优先级(高到低): 算术操作符 → 比较操作符 → 逻辑操作符 → "="赋值符号

    保持先后顺序(操作符优先级) 我们都知道,除法.乘法等操作符的优先级比加法和减法高,例如: var numa=3; var numb=6 jq= numa + 30 / 2 - numb * 3; / ...

  3. JS规则 我与你同在(逻辑与操作符)数学中的“b大于a,b小于c”是“a<b<c”,那么在JavaScript中可以用&&表示

    我与你同在(逻辑与操作符) 数学里面的"a>b",在JavaScript中还表示为a>b:数学中的"b大于a,b小于c"是"a<b& ...

  4. 在vue项目中使用Nprogress.js进度条

    NProgress是一款在网页顶部添加细长进度条的工具,非常轻巧,使用起来也非常便捷,灵感来源于Google, YouTube. 1.安装 $ npm install --save nprogress ...

  5. JSP四个域对象的应用场景

    request 如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域 比如新闻数据,属于用户看完就没用的 session 如果客户向服务器发请求,产生的数据,用户用 ...

  6. MSI右键添加管理员运行.reg

    Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Msi.Package\shell\runas]@="右键以管理员运行MSI& ...

  7. springboot与任务(邮件任务)

    邮件发送需要引入spring-boot-starter-mail Spring Boot 自动配置MailSenderAutoConfiguration 定义MailProperties内容,配置在a ...

  8. AFO之后……

    先上游记:@ 据说有一种东西叫狗屁不通文章生成器:@

  9. Android基础控件ImageView的使用

    1.相关属性 <!--src 设置内容--> <!--background 设置背景--> <!--alpha 设置透明度 --> <!--adjustVie ...

  10. php输出json,需要嵌套数组和对象问题

    https://segmentfault.com/q/1010000009985295 $tmp = []; $tmp['id'] = 'aaa'; $tmp['name'] = 'bbb'; $tm ...