字节跳动—毕业旅行问题

文章目录

  • 字节跳动---毕业旅行问题
  • 一、问题描述
  • 二、分析
  • 三、代码

一、问题描述

小明目前在做一份毕业旅行的规划。打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次。由于经费有限,希望能够通过合理的路线安排尽可能的省一些路上的花销。给定一组城市和每对城市之间的火车票的价钱,找到每个城市只访问一次并返回起点的最小车费花销

输入描述:

城市个数n(1<n≤20,包括北京)城市间的车票价钱 n行n列的矩阵 m[n][n]

输出描述:

最小车费花销 s

输入例子1:

4
0 2 6 5
2 0 4 4
6 4 0 2
5 4 2 0

输出例子1:

13

例子说明1:

共 4 个城市,城市 1 和城市 1 的车费为0,城市 1 和城市 2 之间的车费为 2,城市 1 和城市 3 之间的车费为 6,城市 1 和城市 4 之间的车费为 5,依次类推。假设任意两个城市之间均有单程票可购买,且票价在1000元以内,无需考虑极端情况。

二、分析

方法一:回溯【超时】

把所有的解通过一棵树表达出来,然后通过深度优先遍历,找到一个解的时候就将其记录下来,最后输出最小的解即可


如图所示,从根节点到叶子节点的所经过的节点就是其路径,每个边的长度之和就是总车票价格。

当然还有一种优化的方法,就是在遍历过程中,如果发现此时路径长度已经超出了之前找到的最小路径长度,就可以进行剪支操作,即不再遍历。

这种方法的时间复杂度为O(n!)O(n!)O(n!)O(n!)O(n!)O(n!)O(n!)O(n!)O(n!),当n大于12之后,其计算时间就已经非常大了。这种方法会因为超时无法通过所有的测试数据。

方法二:动规

  • 第一步:明确动态规划的 状态和选择

对于这道题,状态无非就是 旅行出发的起点和经过的城市,所以用一个二维dp数组来进行递归

旅行的出发点 还好说, 用数组的索引 就可以直接表示,关键是怎么表示已经经过的城市,经过的城市不可能只有一个,一个数组的索引肯定不能够表示全部,所以用什么来表示这个状呢???

所以用数组的下标索引当成一个位图,用其中的 每个bit位代表已经经过哪些城市

虽然找到解决经过的城市的方法,但是还要考虑怎么设置进比特位,因为我们在进行判断的时候肯定需要知道对应bit位是那个城市,所以还需要考虑bit位的设计

规定:从1到n-1(n为城市的个数) 用二进制表示的话,刚好可以映射成除了0号城市外的剩余n-1个城市在不在子集n[j],1代表在,0代表不在

例:若有总共有4个城市的话,除了第0号城市,对于1-3号城市
111 = V-1 = 2^3 - 1 = 7 ,从高位到低位表示3到1号城市都在子集中
而101 = 5 ,表示3,1号城市在子集中,而其他城市不在子集中

所以该索引的大小为:1 << n(n为城市的个数)

int stateNum = 1 << n;// dp[i][j]中的i是一个二进制形式的数,表示经过城市的集合,如0111表示经过了城市0,1,2// dp[i][j]表示经过了i中的城市,并且以j结尾的路径长度vector<vector<int> > dp(stateNum,vector<int>(n,MAX));

dp[i][j]的含义:中的i是一个二进制形式的数,表示经过城市的集合,如0111表示经过了城市0,1,2,表示经过了i中的城市,并且以j城市结尾的路径(钱)长度

第二步:明确base case

这个就很容易确定

dp[1][0] = 0; //从城市0出发,所以经过城市0,以城市0结尾的路径为0

从城市0出发,所以经过城市0,以城市0结尾的路径为0

第三步:找状态转移方程

字节跳动---毕业旅行问题相关推荐

  1. 大学刚毕业,用10000小时,走进字节跳动拿了offer

    前言: 没有绝对的天才,只有持续不断的付出.对于我们每一个平凡人来说,改变命运只能依靠努力+幸运,但如果你不够幸运,那就只能拉高努力的占比. 2020年7月,我有幸成为了字节跳动的一名Java后端开发 ...

  2. 字节编程题 毕业旅行问题

    小明目前在做一份毕业旅行的规划.打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次.由于经费有限,希望能够通过合理的路线安排尽可能的省一些路上的花销.给定一组 ...

  3. 字节跳动28岁程序员退休:我只想做一个自由的“废物”

    如何看待28岁的郭宇从字节跳动退休? 郭宇,是谁?又是怎么做到28岁退休的? 为了解开这个疑惑,我查看了他的微博. 其中,他的置顶写了这样的信息: 从高中开始程序员人生,大三收到支付宝实习offer: ...

  4. 年仅28岁的程序员宣布从字节跳动退休,他是如何实现财务自由的?

    你的28岁在干嘛?硕士毕业?苦苦等待一份大厂的offer?有的人,28岁,已经光荣退休了. 事件的起因是从知乎上一条阅读量千万的问题开始,"如何看待年仅 28 岁的郭宇宣布从字节跳动退休?& ...

  5. 年仅28岁的程序员郭宇,宣布从字节跳动辞职,实现财富自由!

    点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 本文转载自公众号"新智元" 来源:知乎 编辑:梦佳.永上 [导读]最近28岁程序员郭宇宣布 ...

  6. 自由了!在字节跳动做码农6年后,28岁郭宇宣布退休!

    新智元 来源:知乎 编辑:梦佳.永上 转自:开发者技术前线 最近28岁程序员郭宇宣布退休上了知乎热搜.郭宇是谁?高考后自学编程,非计算机专业出身,曾入职支付宝,2014年加入字节跳动,28岁实现财富自 ...

  7. Java算法:牛客网字节跳动笔试真题算法Java版1-27题

    题号 题目 知识点 难度 通过率 ZJ1 附加题 动态规划数组 中等 16.45% ZJ2 编程题1 贪心 中等 11.65% ZJ3 编程题2 字符串贪心 中等 29.30% ZJ4 附加题 递归模 ...

  8. 张一鸣宣布卸任字节跳动CEO

    5月20日,字节跳动创始人张一鸣发布内部全员信,宣布卸任CEO一职.字节跳动联合创始人梁汝波将接任成为新CEO. 谈及卸任原因,张一鸣表示,创业以来,字节跳动有幸抓住了时代发展的机遇,基于机器学习技术 ...

  9. 张一鸣卸任字节跳动 CEO,网友调侃因未完成去年 OKR 被优化!

    5月20日,字节跳动创始人张一鸣发布内部全员信,宣布卸任CEO一职.字节跳动联合创始人梁汝波将接任成为新CEO.同时,字节跳动新任CEO梁汝波也发布内部邮件回应到,接替张一鸣承担CEO的职责,对其来说 ...

最新文章

  1. 微信小程序学习做动画效果
  2. 可能是 nginx 限速最容易理解的说明
  3. Spring Boot 关于 @Import注解 —— 导入资源
  4. 第一篇随笔,通常都是内容空洞的。
  5. mysql注入攻击实_三十三、MySQL基础系列笔记之MySQL安全问题与SQL注入攻击
  6. 浅谈FMA与SMA(test)
  7. 坚果云 linux 脚本,深度操作系统Deepin安装坚果云
  8. 哪些英语用法是普通中国学生最生疏的?
  9. W11系统VMware网卡vmnet8显示未识别的网络
  10. 专访 | 为什么中国还没有区块链科技巨头和顶级公链?
  11. java对pdf分割_PDFBox分割PDF文档
  12. 云函数能写php吗,FunctionCloud
  13. mysql怎样发给别人_怎么把数据库发给别人
  14. 2019年高考必备:高中数学向量解题技巧
  15. 必知之vs2019添加外加库文件操作
  16. 海思Hi3516新增sensor imx214 笔记
  17. swift 百度地图加载与百度地图电子围栏加载
  18. 下载了免费的epub电子书,如何用Windows电脑打开?
  19. SFR解析算法 - SFR_Calculation (C语言)
  20. URL must not be null

热门文章

  1. Java RMI 入门
  2. 不使用 Maven 等构建工具,而使用原始方法在 IntelliJ IDEA 中制作 JAR 包
  3. ArcGIS教程:Iso 聚类非监督分类
  4. jquery 实现返回顶部功能
  5. Oracle E-Business Suite 12.1.1 Rapid Clone
  6. 在 Android 应用程序中使用 Internet 数据
  7. 查看mysql进程--show processlist
  8. CodeForces - 351E Jeff and Permutation(贪心)
  9. 洛谷 - P1028 数的计算(线性dp)
  10. PyTorch-数据准备