• 校招真题练习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 }
  • 相关阅读:
    简单复利计算java板
    弹出提示框的方式——java
    实验一 命令解释程序
    简单复利计算c语言实现
    操作系统
    jsp 页面和 jsp标记
    对it行业的一些看法
    又穷自动机的构造
    复利计算——结对编程2.0
    汉堡包
  • 原文地址:https://www.cnblogs.com/asenyang/p/11222400.html
Copyright © 2020-2023  润新知