题目描述

某乡有n个村庄(1

输入格式:

村庄数n和各村之间的路程(均是整数)。

输出格式:

最短的路程。

输入样例:

3

0 2 1

1 0 2

2 1 0

输出样例

3

说明

输入解释

3 {村庄数}

0 2 1 {村庄1到各村的路程}

1 0 2 {村庄2到各村的路程}

2 1 0 {村庄3到各村的路程}


题目分析

又是一道状压DP经典

我们以一串二进制数表示村庄的集合(状态)

1表示该村庄访问过,0表示没有

定义dp[i][j]表示

从起点到第j号点

且到达时状态恰好为i的最短路

则最后答案就是min(dp[(1<< n) -1][i] + map[i][1]) (2<=i<=n)

其中map数组是题目给定的各村庄间距离

而求取dp数组的方法

我们可以借鉴Floyd的思想

具体代码:

    for(int i =0;i<=(1 << n) -1;i++)
    for(int j=1;j<=n;j++)
    if( !( (1 << j-1) & i) )
    for(int k=1;k<=n;k++)
    if( ( (1 << k-1) & i) )
    dp[((1 << j-1) | i)][j] = min(dp[((1 << j-1) | i)][j],dp[i][k] + map[k][j]);

如何解释呢

第一层循环 i 枚举每个可能的状态

第二层循环 j 枚举下一步到达的点

if( !( (1 << j-1) & i) ) 这句判断 j 是否已访问

1左移j-1位,则此时只有第j位是1

若状态 i 的第 j 位为1,则&与运算返回1,表示已访问,否则没访问

第三层循环枚举中介点k

if语句判断同上

接下来核心代码——更新

dp[ (1 << j-1) | i ][j] = min(dp[((1 << j-1) | i)][j],dp[i][k] + map[k][j]);

(1 << j-1) | i 将状态的第j为置为1得到下一步的状态

dp[i][k] + map[k][j])表示在当前状态i中寻找中介点检查最短路是否可以更新


#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;

int read()
{
    int f=1,x=0;
    char ss=getchar();
    while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}
    while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}
    return f*x;
}

int n;
int dp[1100010][25];
int map[25][25];

int main()
{

    n=read();
    for(int i = 1;i <= n;i ++)
    for(int j = 1;j <= n;j ++)
    map[i][j]=read();//读入个村庄间距离

    memset(dp,63,sizeof(dp));
    dp[1][1] = 0;//状态1表示此时只有1号点访问过

    for(int i =0;i<=(1 << n) -1;i++)
    for(int j=1;j<=n;j++)
    if( !( (1 << j-1) & i) )
    for(int k=1;k<=n;k++)
    if( ( (1 << k-1) & i) )
    dp[((1 << j-1) | i)][j] = min(dp[((1 << j-1) | i)][j],dp[i][k] + map[k][j]);//核心代码,解释如上所述

    int ans = 2147483640;
    for(int i=2;i<=n;i++)//最后从状态(1<<n)-1(二进制全为1)中寻找到1最短的点
    ans=min(ans,dp[(1<<n)-1][i] + map[i][1]);

    cout<<ans;
    return 0;
}

蒟蒻看到这题n<=20的范围挺大

担心卡常所以开了O2

最后总共跑了1392ms,最大的点跑了608ms

目测不开O2也是能过的

洛谷P1171 售货员的难题【状压DP】的更多相关文章

  1. 2018.07.18 洛谷P1171 售货员的难题(状压dp)

    传送门 感觉是一道经典的状压dp,随便写了一发卡了卡常数开了个O(2)" role="presentation" style="position: relati ...

  2. 洛谷P1171 售货员的难题

    P1171 售货员的难题 题目背景 数据有更改 题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且 ...

  3. 洛谷 P1171 售货员的难题

    P1171 售货员的难题 题目背景 数据有更改 题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且 ...

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

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

  5. codevs2596 售货员的难题(状压dp)

    2596 售货员的难题  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 钻石 Diamond     题目描述 Description 某乡有n个村庄(1<n<=15 ...

  6. 洛谷 P1278 单词游戏 【状压dp】

    题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只 ...

  7. 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]

    题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...

  8. 洛谷P2761 软件补丁问题(状压DP,SPFA)

    题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...

  9. 洛谷P2831 愤怒的小鸟——贪心?状压DP

    题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...

随机推荐

  1. libz.dylib

    1. .dylib意味着这是一个动态链接库. 2. libz.dylib是提供zip压缩解压缩的库

  2. 为什么alertView弹出后button会消失的问题

    按option后会有提示:Do not use the label object to set the text color or the shadow color. Instead, use the ...

  3. different between<A Href> and <jsp: forward>

    i want to access Servelt by hyperlink in a jsp web site connection.jsp <%@ page contentType=" ...

  4. 洛谷 P1078 文化之旅

    P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...

  5. Linuxc - 执行c程序

    1.新建工作空间 root@jiqing-virtual-machine:~/cspace/les1# pwd /root/cspace/les1 2.新建c程序 root@jiqing-virtua ...

  6. 疑难杂症——关于EntityFramework的SqlQuery方法的执行效率差异的探讨

    前言:最近项目上面遇到一个问题,在Code First模式里面使用EntityFramework的SqlQuery()方法查询非常慢,一条数据查询出来需要10秒以上的时间,可是将sql语句放在plsq ...

  7. [转]linux下centos服务器安全设置

    引言: 我们必须明白:最小的权限+最少的服务=最大的安全 所以,无论是配置任何服务器,我们都必须把不用的服务关闭.把系统权限设置到最小话,这样才能保证服务器最大的安全.下面是CentOS服务器安全设置 ...

  8. 自己写的日志框架--linkinLog4j--日志框架的必要性

    OK,在开始研究Log4j的源码之前,我们先来自己模拟一个日志工具,名字就叫linkinlog4j好了. 在软件开发过程中,出现bug总是在所难免:事实上,以我个人经验,即使在实际开发阶段,fix b ...

  9. asp.net core 部署到服务器之后外网访问不了

    部署发现问题 今天在部署.net core的时候,发现访问http://localhost:xxxx可以,但是用外网访问并不行! 开始尝试解决问题 一开始以为是nginx的问题.各种折腾,各种改配置文 ...

  10. 【转】Linux从入门到精通——运维工程师成长路线图——CTO马哥Linux视频教学

    加油! http://edu.51cto.com/roadmap/view/id-2.html#6853467-sqq-1-36881-57ccc7d95ea58df839decd91bd220170