原题链接

题目简要分析

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. 面试15--strcmp,strcpy,memmove实现

    一. strcmp strcmp是用于比较两个字符串的大小的.   int strcmp( const char *string1, const char *string2 ) char *strin ...

  2. GitHub 手把手教你如何把本地项目或代码提交到Github托管

    GitHub 手把手教你如何把项目或代码提交到Github托管 启动Git Bash命令行 重点内容 1.首先打开你的github,点击新建项目,点击new repositories ,然后直接给项目 ...

  3. planAhead的启动时间较长

    发现Xilinx planAhead的启动时间约需10秒钟.

  4. glew的安装

    下载链接: https://sourceforge.net/project/downloading.php?group_id=67586&filename=glew-1.5.1-win32.z ...

  5. Mongoose 索引

    Mongoose 索引介绍 索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更 快(如果有些字段是用不着的就不要设置索引).MongoDB 的索引几乎与传统的关系型数据库一 ...

  6. SpringAOP ApectJ 动态代理

    参考链接:https://docs.spring.io/spring/docs/4.3.13.RELEASE/spring-framework-reference/htmlsingle/#aop ht ...

  7. ThinkPHP 5.1 跨域中间件

    <?php namespace app\http\middleware; class CrossDomain { public function handle($request, \Closur ...

  8. ios兼容性收集整理

    1. ios系统兼input输入框光标问题 异常现象:苹果手机文本输入框样式异常——光标聚焦到文本框,光标高度充满文本框,输入内容,光标高度为文本框上边框到输入内容底部: 光标聚焦: 输入内容: 异常 ...

  9. 接口项目servlet的一种处理方式,将异常返回给调用者【我】

    接口项目servlet的一种处理方式,其他层有异常全部网上抛,抛到servlet层,将异常返回给调用者: Servlet层: private void processRequest(HttpServl ...

  10. JAVA 创建也项目平级文件

    String url = System.getProperty("user.dir") +"/logs/test.txt" File file = new Fi ...