字节跳动:毕业旅行问题(C++语言实现)

毕业旅行问题

题目描述

小明目前在做一份毕业旅行的规划。
打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次。
由于经费有限,希望能够通过合理的路线安排尽可能的省一些路上的花销。
给定一组城市和每对城市之间的火车票的价钱,找到每个城市只访问一次并返回起点的最小车费花销。
  • 输入描述
城市个数n(1<n≤20,包括北京)
城市间的车票价钱:n行n列的矩阵m[n][n]
  • 输出描述
最小车费花销s
  • 示例
# 输入
4
0 2 6 5
2 0 4 4
6 4 0 2
5 4 2 0

# 输出
13

暴力求解

由于城市间来往的路径是一样的,这里利用集合来避免一半的消耗。即使这样,内存仍然超限。

from itertools import permutations


def minimum_cost(n, seq):
    possible = list(permutations(range(1, n), n-1))
    end = set()
    for pu in possible:
        if pu not in end and pu[::-1] not in end:
            end.add(pu)

    spend = float('inf')
    for eu in end:
        current = [0] + list(eu) + [0]
        value = 0
        for ci in range(len(current)-1):
            pre, cur = current[ci], current[ci+1]
            value += seq[pre][cur]
        if spend > value:
            spend = value
    return spend


if __name__ == '__main__':
    n = int(input().strip())
    seq = []
    for _ in range(n):
        seq.append(list(map(int, input().strip().split())))
    res = minimum_cost(n, seq)
    print(res)

旅行商问题

状态转移:当前在城市start,经过的城市为mid时,可以转移到城市vu。Python语言实现超时,该用C++语言。

def minimum_cost(n, seq):
    value = 1 << (n-1)
    dp = [[float('inf')]*value for _ in range(n)]

    for nu in range(n):
        dp[nu][0] = seq[nu][0]

    for vu in range(1, value):
        for start in range(n):
            if dp[start][vu] == float('inf'):
                for mid in range(1, n):
                    if (vu>>(mid-1)) & 1 == 1:
                        current = seq[start][mid] + dp[mid][vu^(1<<(mid-1))]
                        if current < dp[start][vu]:
                            dp[start][vu] = current
    return dp[0][-1]


if __name__ == '__main__':
    n = int(input().strip())
    seq = []
    for _ in range(n):
        seq.append(list(map(int, input().strip().split())))
    res = minimum_cost(n, seq)
    print(res)

# 样例学习

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


Update: 0 1 0
1 0 3
[0, 4, inf, inf, inf, inf, inf, inf]
[2, inf, inf, inf, inf, inf, inf, inf]
[6, inf, inf, inf, inf, inf, inf, inf]
[5, inf, inf, inf, inf, inf, inf, inf]

Update: 1 1 0
1 1 3
[0, 4, inf, inf, inf, inf, inf, inf]
[2, 2, inf, inf, inf, inf, inf, inf]
[6, inf, inf, inf, inf, inf, inf, inf]
[5, inf, inf, inf, inf, inf, inf, inf]

Update: 2 1 0
1 2 3
[0, 4, inf, inf, inf, inf, inf, inf]
[2, 2, inf, inf, inf, inf, inf, inf]
[6, 6, inf, inf, inf, inf, inf, inf]
[5, inf, inf, inf, inf, inf, inf, inf]

Update: 3 1 0
1 3 3
[0, 4, inf, inf, inf, inf, inf, inf]
[2, 2, inf, inf, inf, inf, inf, inf]
[6, 6, inf, inf, inf, inf, inf, inf]
[5, 6, inf, inf, inf, inf, inf, inf]

Update: 0 2 0
2 0 3
[0, 4, 12, inf, inf, inf, inf, inf]
[2, 2, inf, inf, inf, inf, inf, inf]
[6, 6, inf, inf, inf, inf, inf, inf]
[5, 6, inf, inf, inf, inf, inf, inf]

Update: 1 2 0
2 1 3
[0, 4, 12, inf, inf, inf, inf, inf]
[2, 2, 10, inf, inf, inf, inf, inf]
[6, 6, inf, inf, inf, inf, inf, inf]
[5, 6, inf, inf, inf, inf, inf, inf]

Update: 2 2 0
2 2 3
[0, 4, 12, inf, inf, inf, inf, inf]
[2, 2, 10, inf, inf, inf, inf, inf]
[6, 6, 6, inf, inf, inf, inf, inf]
[5, 6, inf, inf, inf, inf, inf, inf]

Update: 3 2 0
2 3 3
[0, 4, 12, inf, inf, inf, inf, inf]
[2, 2, 10, inf, inf, inf, inf, inf]
[6, 6, 6, inf, inf, inf, inf, inf]
[5, 6, 8, inf, inf, inf, inf, inf]

Update: 0 1 2
Update: 0 2 1
3 0 3
[0, 4, 12, 12, inf, inf, inf, inf]
[2, 2, 10, inf, inf, inf, inf, inf]
[6, 6, 6, inf, inf, inf, inf, inf]
[5, 6, 8, inf, inf, inf, inf, inf]

Update: 1 1 2
Update: 1 2 1
3 1 3
[0, 4, 12, 12, inf, inf, inf, inf]
[2, 2, 10, 10, inf, inf, inf, inf]
[6, 6, 6, inf, inf, inf, inf, inf]
[5, 6, 8, inf, inf, inf, inf, inf]

Update: 2 1 2
Update: 2 2 1
3 2 3
[0, 4, 12, 12, inf, inf, inf, inf]
[2, 2, 10, 10, inf, inf, inf, inf]
[6, 6, 6, 6, inf, inf, inf, inf]
[5, 6, 8, inf, inf, inf, inf, inf]

Update: 3 1 2
Update: 3 2 1
3 3 3
[0, 4, 12, 12, inf, inf, inf, inf]
[2, 2, 10, 10, inf, inf, inf, inf]
[6, 6, 6, 6, inf, inf, inf, inf]
[5, 6, 8, 8, inf, inf, inf, inf]

Update: 0 3 0
4 0 3
[0, 4, 12, 12, 10, inf, inf, inf]
[2, 2, 10, 10, inf, inf, inf, inf]
[6, 6, 6, 6, inf, inf, inf, inf]
[5, 6, 8, 8, inf, inf, inf, inf]

Update: 1 3 0
4 1 3
[0, 4, 12, 12, 10, inf, inf, inf]
[2, 2, 10, 10, 9, inf, inf, inf]
[6, 6, 6, 6, inf, inf, inf, inf]
[5, 6, 8, 8, inf, inf, inf, inf]

Update: 2 3 0
4 2 3
[0, 4, 12, 12, 10, inf, inf, inf]
[2, 2, 10, 10, 9, inf, inf, inf]
[6, 6, 6, 6, 7, inf, inf, inf]
[5, 6, 8, 8, inf, inf, inf, inf]

Update: 3 3 0
4 3 3
[0, 4, 12, 12, 10, inf, inf, inf]
[2, 2, 10, 10, 9, inf, inf, inf]
[6, 6, 6, 6, 7, inf, inf, inf]
[5, 6, 8, 8, 5, inf, inf, inf]

Update: 0 1 4
Update: 0 3 1
5 0 3
[0, 4, 12, 12, 10, 11, inf, inf]
[2, 2, 10, 10, 9, inf, inf, inf]
[6, 6, 6, 6, 7, inf, inf, inf]
[5, 6, 8, 8, 5, inf, inf, inf]

Update: 1 1 4
Update: 1 3 1
5 1 3
[0, 4, 12, 12, 10, 11, inf, inf]
[2, 2, 10, 10, 9, 9, inf, inf]
[6, 6, 6, 6, 7, inf, inf, inf]
[5, 6, 8, 8, 5, inf, inf, inf]

Update: 2 1 4
Update: 2 3 1
5 2 3
[0, 4, 12, 12, 10, 11, inf, inf]
[2, 2, 10, 10, 9, 9, inf, inf]
[6, 6, 6, 6, 7, 8, inf, inf]
[5, 6, 8, 8, 5, inf, inf, inf]

Update: 3 1 4
Update: 3 3 1
5 3 3
[0, 4, 12, 12, 10, 11, inf, inf]
[2, 2, 10, 10, 9, 9, inf, inf]
[6, 6, 6, 6, 7, 8, inf, inf]
[5, 6, 8, 8, 5, 6, inf, inf]

Update: 0 2 4
Update: 0 3 2
6 0 3
[0, 4, 12, 12, 10, 11, 13, inf]
[2, 2, 10, 10, 9, 9, inf, inf]
[6, 6, 6, 6, 7, 8, inf, inf]
[5, 6, 8, 8, 5, 6, inf, inf]

Update: 1 2 4
Update: 1 3 2
6 1 3
[0, 4, 12, 12, 10, 11, 13, inf]
[2, 2, 10, 10, 9, 9, 11, inf]
[6, 6, 6, 6, 7, 8, inf, inf]
[5, 6, 8, 8, 5, 6, inf, inf]

Update: 2 2 4
Update: 2 3 2
6 2 3
[0, 4, 12, 12, 10, 11, 13, inf]
[2, 2, 10, 10, 9, 9, 11, inf]
[6, 6, 6, 6, 7, 8, 7, inf]
[5, 6, 8, 8, 5, 6, inf, inf]

Update: 3 2 4
Update: 3 3 2
6 3 3
[0, 4, 12, 12, 10, 11, 13, inf]
[2, 2, 10, 10, 9, 9, 11, inf]
[6, 6, 6, 6, 7, 8, 7, inf]
[5, 6, 8, 8, 5, 6, 8, inf]

Update: 0 1 6
Update: 0 2 5
Update: 0 3 3
7 0 3
[0, 4, 12, 12, 10, 11, 13, 13]
[2, 2, 10, 10, 9, 9, 11, inf]
[6, 6, 6, 6, 7, 8, 7, inf]
[5, 6, 8, 8, 5, 6, 8, inf]

Update: 1 1 6
Update: 1 2 5
Update: 1 3 3
7 1 3
[0, 4, 12, 12, 10, 11, 13, 13]
[2, 2, 10, 10, 9, 9, 11, 11]
[6, 6, 6, 6, 7, 8, 7, inf]
[5, 6, 8, 8, 5, 6, 8, inf]

Update: 2 1 6
Update: 2 2 5
Update: 2 3 3
7 2 3
[0, 4, 12, 12, 10, 11, 13, 13]
[2, 2, 10, 10, 9, 9, 11, 11]
[6, 6, 6, 6, 7, 8, 7, 8]
[5, 6, 8, 8, 5, 6, 8, inf]

Update: 3 1 6
Update: 3 2 5
Update: 3 3 3
7 3 3
[0, 4, 12, 12, 10, 11, 13, 13]
[2, 2, 10, 10, 9, 9, 11, 11]
[6, 6, 6, 6, 7, 8, 7, 8]
[5, 6, 8, 8, 5, 6, 8, 8]

13
#include <iostream>
#include <vector>

using namespace std;

int mininum_cost(int n, vector<vector<int>> seq)
{
    int value = 1 << (n-1);
    int inf = 0x7fffffff;
    vector<vector<int>> dp(n, vector<int>(value, inf));

    for(int nu=0; nu<n; nu++)
        dp[nu][0] = seq[nu][0];

    for(int vu=1; vu < value; vu++)
    {
        for(int start=0; start<n; start++)
        {
            if(dp[start][vu] == inf)
            {
                for(int mid=1; mid<n; mid++)
                {
                    if(((vu>>(mid-1)) & 1) == 1)
                    {
                        int current = seq[start][mid] + dp[mid][(vu^(1<<(mid-1)))];
                        if(current < dp[start][vu])
                            dp[start][vu] = current;
                    }
                }
            }
        }
    }
    return dp[0][value-1];
}

int main()
{
    int n;
    cin >> n;

    vector<vector<int>> seq(n, vector<int>(n, 0));
    for(int ni=0; ni<n; ni++)
        for(int nj=0; nj<n; nj++)
            cin >> seq[ni][nj];

    int res = mininum_cost(n, seq);
    cout << res << endl;

    return 0;
}

(最近更新:2019年09月07日)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 密码学是研究如何保护信息安全的学科,主要包括加密算法和解密算法的设计与实现。C/C++语言是一种被广泛应用于密码学领域的编程语言,其提供了丰富的库函数和数据类型,方便实现各种密码学算法。 在密码学中,加密算法是用于将明文转换为密文的算法,而解密算法则是用于将密文转换回明文的算法。C/C++语言的灵活性和高效性使其成为实现这些算法的理想选择。 在C/C++语言中,可以使用各种库函数来实现密码学算法。例如,可以使用OpenSSL库函数来实现各种对称加密算法(如AES、DES)和非对称加密算法(如RSA、DSA)。这些库函数提供了一系列接口,可以方便地进行密钥生成、加密和解密操作。 此外,C/C++语言还提供了丰富的数据类型和运算操作,可以方便地进行数据处理和运算。例如,可以使用位运算来实现一些常见的密码学操作,如异或操作和循环左移操作。同时,C/C++语言还提供了高效的数据结构,如数组和指针,可以方便地进行数据存储和访问。 总之,C/C++语言在密码学中的应用广泛且灵活。通过使用C/C++语言,可以方便地实现各种加密算法和解密算法,并保护信息的安全。但是在使用C/C++语言实现密码学算法时,需要注意安全性和效率的问题,避免出现漏洞和性能问题。 ### 回答2: 密码学是一门关于保护信息安全的学科,它研究如何设计密码算法以及如何使用密码算法来加密和解密信息。C/C++是一种广泛使用的编程语言,它具有快速、高效的特点,非常适合用来实现密码学算法。 在密码学中,常用的算法有对称加密算法和非对称加密算法。对称加密算法使用同一个密钥来进行加密和解密,而非对称加密算法使用一对密钥,其中一个用于加密,另一个用于解密。 在C/C++中,我们可以使用库函数来实现密码学算法。例如,在对称加密算法中,可以使用openssl库中的函数来实现AES、DES等算法。这些函数提供了加密和解密的接口,我们只需要调用相应的函数,并传入待加密的明文和密钥参数即可实现加密和解密过程。 对于非对称加密算法,我们可以使用openssl库中的函数来实现RSA算法。这些函数提供了生成密钥对、公钥加密、私钥解密的功能,我们可以使用这些函数来实现基于RSA的加密和解密操作。 除了使用库函数外,我们还可以自己编写密码学算法的实现。C/C++具有丰富的数据类型和数据结构,我们可以利用这些特性来实现不同的密码学算法,例如SHA-256哈希算法、AES加密算法等。只需要按照算法的规则进行编码,进行相关的运算和操作即可实现密码学算法。 总之,C/C++语言可以很方便地实现密码学算法,无论是使用库函数还是自己编写算法的实现,都可以利用C/C++的特性和功能来保护信息的安全。 ### 回答3: 密码学是一项研究如何保护通信安全和数据保密性的学科。在密码学中,密钥起着至关重要的作用,因为正确的密钥是保护数据的关键。C/C++语言是一种广泛应用于软件开发的编程语言,可以实现各种密码学算法和协议。 在密码学中,常用的算法有对称加密算法和非对称加密算法。对称加密算法使用相同的密钥进行加密和解密,如AES和DES算法。我们可以使用C/C++语言实现这些算法,通过调用相应的函数来加密和解密数据。这需要理解算法的原理和加密过程,以及相关的库函数和语法。 非对称加密算法使用一对公私钥进行加密和解密,如RSA算法。在C/C++中,可以使用相关库函数来生成密钥对、加密和解密数据。这种加密算法更加安全,但由于复杂性和计算开销较大,通常只用于加密较短的数据或者用于对称密钥的安全传输。 除了加密算法,C/C++语言还可以实现密码学中的其他功能,如哈希函数和数字签名。哈希函数用于将任意长度的数据转化为固定长度的哈希值,常用的算法有MD5和SHA。数字签名用于验证数据的完整性和真实性,通过私钥对数据进行签名,再通过公钥进行验证。 总之,C/C++语言可以通过实现密码学算法和相关功能来保护通信安全和数据保密性。为了确保安全性,需要深入理解密码学的原理和算法设计,同时注意使用安全的库函数和保护密钥的安全存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值