openjudge4979 - 海贼王之伟大航路 题解
题目简要分析
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 - 海贼王之伟大航路 题解的更多相关文章
- ACM: 强化训练-海贼王之伟大航路-dfs-枝减
海贼王之伟大航路 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Descriptio ...
- ACM 海贼王之伟大航路(深搜剪枝)
"我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ...
- ACM北大暑期课培训第二天
今天继续讲的动态规划 ... 补充几个要点: 1. 善于利用滚动数组(可减少内存,用法与计算方向有关) 2.升维 3.可利用一些数据结构等方法使代码更优 (比如优先队列) 4.一般看到数值小的 (十 ...
- 基于html5海贼王单页视差滚动特效
分享一款基于html5海贼王单页视差滚动特效是一款流行滑落网页特效代码.效果图如下: 在线预览 源码下载 实现的代码: <div class="top"> < ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
随机推荐
- KVM系统镜像制作
使用virt-install创建虚拟机并安装GuestOS virt-install是一个命令行工具,它能够为KVM.Xen或其它支持libvirt API的hypervisor创建虚拟机并完成Gue ...
- UmiJS可插拔的企业级 react 应用框架,配合ant-design-pro使用
入门非常简单 # 安装 $ yarn global add umi # 或者 npm install -g umi # 新建应用 $ mkdir myapp && cd myapp # ...
- CentOS 7 上 安装 jira
步骤 .安装jdk8 https://www.cnblogs.com/sea-stream/p/10404360.html .安装mysql wget -i -c http://dev.mysql.c ...
- cesium地下模式(地表透明)2
接上一篇博客,这篇直接分析火星的源码,看它到底改了些什么. 注意:在cesium1.63.1版本改变了模块化方式,由AMD改为ES6模块化.注意引入文件加载模块时做出对应修改. 1.火星代码里修改了4 ...
- IntelliJ IDEA 快捷键终极大全,速度收藏!
阅读本文大概需要 6 分钟. ▌自动代码 常用的有 fori/sout/psvm+Tab 即可生成循环.System.out.main 方法等 boilerplate 样板代码 . 例如要输入 fo ...
- Http协议以及Httpclient
一.HTTP之请求消息Request 客户端发送一个HTTP请求到服务器的请求消息包括以下格式: 请求行(request line).请求头部(header).空行和请求数据四个部分组成. Http请 ...
- ubuntu之路——day19.1 深度CNN的探究
1.经典的CNN LeNet-5 1998的CNN鼻祖 以前用的sigmoid和tanh 下图给的是relu和softmax AlexNet ImageNet2012的冠军 VGG-16 ImageN ...
- IIS部署Silverlight
题设: 网站如果应用了Silverlight技术,直接部署到IIS中是无法正常运行的, 分析: 因为Silverlight应用所对应的三种MIME类型没有在IIS中注册,所以Silverlight相关 ...
- 拷贝Maven依赖jar包到指定目录
一.导出到默认目录 targed/dependency 从Maven项目中导出项目依赖的jar包:进入工程pom.xml 所在的目录下,执行如下命令: 1 mvn dependency:copy-de ...
- Cross-channel Communication Networks
Cross-channel Communication Networks 2019-12-13 14:17:18 Paper: https://papers.nips.cc/paper/8411-cr ...