校招真题练习019 毕业旅行问题(头条)

Posted asenyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了校招真题练习019 毕业旅行问题(头条)相关的知识,希望对你有一定的参考价值。

毕业旅行问题

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

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

输出描述:
最小车费花销 s

牛客网上对此题的python语言判断似乎有问题,一直超时,之前做剑指Offer的题目,也有一道出现这种情况。

这种平台级语言杀还是挺坑人的。

找了一份C++的代码:

 1 #include<iostream>
 2 #include<vector>
 3 #include<unordered_map>
 4 using namespace std;
 5  
 6 int getAns(vector<vector<int>> &nums)
 7      
 8     int M = 0x7ffffff;
 9     int n = nums.size();
10     vector<vector<int>> dp(1<<n, vector<int>(n,M));
11     dp[1][0] = 0;
12     for(int i=1; i<n; i++) dp[1<<i][i] = M;
13     for(int i=1; i<(1<<n); i++)
14         for(int j=0; j<n; j++)
15             if(dp[i][j]!=M)
16                 for(int k=0; k<n; k++)
17                     if((i&(1<<k))==0)
18                         dp[i|(1<<k)][k] = min(dp[i|(1<<k)][k], dp[i][j]+nums[j][k]);
19                     
20                 
21             
22         
23     
24     int ans = M;
25     for(int i=1; i<n; i++)
26         ans = min(ans, dp[(1<<n)-1][i]+nums[i][0]);
27     
28     return ans;
29 
30 int main()
31     int n;
32     while(cin>>n)
33         vector<vector<int>> edges(n,vector<int>(n,0));
34         int x;
35         for(int i=0; i<n; i++)
36             for(int j=0; j<n; j++)
37                 cin>>edges[i][j];
38             
39         
40         cout<<getAns(edges)<<endl;
41     
42     return 0;
43 

 

以上是关于校招真题练习019 毕业旅行问题(头条)的主要内容,如果未能解决你的问题,请参考以下文章

校招真题练习006 爬楼梯(小米)

校招真题练习036 寻找丑数(滴滴)

校招真题练习029 圈地运动(360)

校招真题练习027 小易的字典(网易)

校招真题练习023 俄罗斯方块(网易)

2018 拼多多 校招真题 最大乘积