原题链接

题目简要分析

N个点,从1号点到N号点求最短路径,且每个点都要遍历到。现在要你求出最优方案。

这道题看到后,首先的想法莫过于搜索、暴力了。这显然不太可能。而进一步思考,使用Floyed和Dijkstra也不太好用,因为题目描述说:"每个点都要遍历到",自然又否决了这个方法。那么怎么办呢?

状态压缩DP


什么是状态压缩?

由于所有点在DP阶段中的状态只有走过( true )和没走过( false ),那么用0、1的二进制表示每个阶段即可。

比如现在有5个点,现在只经过了2、3、5号点。那么二进制就可以这样表示:

01101

再转换成十进制即可


如何记录阶段?

所以我们的DP数组需要二维,一维记录当前二进制状态用十进制表示的数,另一维记录当前阶段点,也就是当前点是否经过。

dp[i][j] 表示i状态下走到j号点最优方案

状态转移方程是什么?

我们只要再枚举一个点,即枚举上一个点,合法就取min值即可。

AC代码

#include<bits/stdc++.h>
using namespace std; const int MAXN = 20 + 5; int n,dp[(1 << 17)][MAXN];
int dis[MAXN][MAXN]; inline int read(){//快速读入
int f = 1, x = 0;
char c = getchar(); while (c < '0' || c > '9')
{
if (c == '-')
f = -1;
c = getchar();
} while (c >= '0' && c <= '9')
{
x = x * 10 + c - '0';
c = getchar();
} return f * x;
} int Hamilton(){
memset(dp,0x3f,sizeof(dp));
dp[1][1] = 0;
for(int i = 1;i <= (1 << (n + 1)) - 1; i++){
for(int j = 1;j <= n; j++){
if(!((i >> j) & 1))continue;
for(int k = 1;k <= n; k++){
if(!((i >> k) & 1))continue;
dp[i][j] = min(dp[i][j],dp[i ^ (1 << j)][k] + dis[k][j]);
}
}
}
return dp[(1 << (n + 1)) - 1][n];
} int main(){
n = read();
for(int i = 1;i <= n; i++)
for(int j = 1;j <= n; j++){
dis[i][j] = read();
} //dp[i][j]:i表示所有点压缩后的状态,j表示当前在的点
//则dp[(1 << (n + 1)) - 1][n]就是最后答案
cout<<Hamilton();
return 0;
}

openjudge4979 - 海贼王之伟大航路 题解的更多相关文章

  1. ACM: 强化训练-海贼王之伟大航路-dfs-枝减

    海贼王之伟大航路 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Descriptio ...

  2. ACM 海贼王之伟大航路(深搜剪枝)

    "我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ...

  3. ACM北大暑期课培训第二天

    今天继续讲的动态规划 ... 补充几个要点: 1. 善于利用滚动数组(可减少内存,用法与计算方向有关) 2.升维 3.可利用一些数据结构等方法使代码更优  (比如优先队列) 4.一般看到数值小的 (十 ...

  4. 基于html5海贼王单页视差滚动特效

    分享一款基于html5海贼王单页视差滚动特效是一款流行滑落网页特效代码.效果图如下: 在线预览   源码下载 实现的代码: <div class="top"> < ...

  5. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  6. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  7. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  8. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  9. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

随机推荐

  1. foreach中的collection

    foreach中collection的三种用法 https://www.cnblogs.com/xiemingjun/p/9800999.html foreach的主要用在构建in条件中,它可以在SQ ...

  2. ksh与bash的异同

    (1) 在ksh是,数组的index只能从0到1023,而bash中没有这样的限制. (2) ksh与bash初始化数组的语法不同: 如下所示 icymoon# ksh icymoon# set -A ...

  3. ARC098F Donation

    传送门 Atcoder Solution 首先是几个引理: 重新定义权值\(val_i=max(a_i-b_i,0)\),那么通过这个点必须需要\(val_i+b_i\)的钱. 多次经过一个点一定是在 ...

  4. 5G 融合计费系统架构设计与实现(一)

    5G 融合计费系统架构设计与实现(一) 随着5G商用临近,5G的各个子系统也在加紧研发调试,本人有兴全程参与5G中的融合计费系统(CCS)的设计.开发.联调工作.接下来将用几篇文章介绍我们在CCS实现 ...

  5. webpack配置css浏览器前缀

    webpack打包时,css自动添加浏览器前缀.我们需要用到一个Loader:postcss-loader,和一个插件:autoprefixer 安装 npm i postcss-loader aut ...

  6. 用JAVA把内存里的二进制文件打包成ZIP包

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.ut ...

  7. 字符串反转(java和js)

    写在前面 关于字符串反转的奇技淫巧很多, 会一种就行了, 但是解锁更多姿势可谓艺多不压身啊~~ 正文 java https://www.cnblogs.com/binye-typing/p/92609 ...

  8. Android -------- kotlin插件神器Json直接生成javaBean

    这是一个data class从JSON字符串生成Kotlin 的插件,换句话说,是一个将JSON字符串转换为Kotlin data class(Json到Kotlin)的插件 在使用Kotlin进行开 ...

  9. Nginx返回固定json或者文本格式的方法

    在系统还没有做集群的情况下,直接重启项目时刚好用户在使用的话,一般都会受到投诉,那么使用nginx返回类似“系统维护”的提示信息并且提前在应用上面做通知才是合适的做法 那么记录一下nginx里面的配置 ...

  10. odoo开发学习「目录」

    目录: 一.odoo介绍(发源 版本 ERP对比 优势劣势 应用场景 发展情况 社区介绍) 二.odoo设计思想 三.odoo自带模块 四.odoo开发前准备(python基础) 五.odoo环境搭建 ...