原题链接

题目简要分析

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;
}

最新文章

  1. Web 前端开发人员和设计师必读文章推荐【系列二十八】
  2. VS2012编译VS2010版本的过程报错解决
  3. cocos2d Slider 透明滑动部件无法生成解决办法
  4. 维翔主机asp主机使用遇到的问题及解决方案总结
  5. 六、Socket之UDP异步传输文件-实现稳定的文件传输
  6. springmvc学习(五)——处理模型数据
  7. eclipse 使 用Ctrl+鼠标左键进入mapper.xml文件的方法
  8. React Native - 网页组件(WebView)的使用详解
  9. Spring引入外部项目Junit 报ClassNotfound问题
  10. 常用Linux VPS/服务器SSH连接工具 - Xshell下载与使用
  11. 算法:快速排序实现 &amp; 定制比较函数
  12. 洛谷P2312 解方程 [noip2014] 数论
  13. Flutter完整开发实战详解
  14. web服务器安全笔记
  15. Codeforces(Round #93) 126 B. Password
  16. C基础入门 - 第一章 - C语言绪言
  17. OpenCV平面物体检测
  18. python 低版本一段扫描代码
  19. js 定时器的用法和清除
  20. ZOJ3874 Permutation Graph(NTT&amp;&amp;cdq分治)

热门文章

  1. CF1245D: Shichikuji and Power Grid
  2. 【JZOJ6246】【20190627】B
  3. SP5971 LCMSUM 数论
  4. R = [obj for obj in recs[imagename] if obj[&#39;name&#39;] == classname] KeyError: &#39;007765&#39;
  5. mysql5.7密码过期ERROR 1862 (HY000): Your password has expired. To log in you must change
  6. create-react-app项目暴露webpack配置文件
  7. 科研黑帮 | Molecular Genetic Anatomy and Risk Profile of Hirschsprung’s Disease
  8. Keras split train test set when using ImageDataGenerator
  9. Android TextView部分文字实现点击事件
  10. 如何在nginx下实现访问web网站密码认证保护的功能