校招真題練習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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM