題目描述
小明目前在做一份畢業旅行的規划。打算從北京出發,分別去若干個城市,然后再回到北京,每個城市之間均乘坐高鐵,且每個城市只去一次。由於經費有限,希望能夠通過合理的路線安排盡可能的省一些路上的花銷。給定一組城市和每對城市之間的火車票的價錢,找到每個城市只訪問一次並返回起點的最小車費花銷。
輸入描述:
城市個數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 }
