Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 旅行商的递推动态规划方法_C++_Algorithm_Recursion_Dynamic Programming - Fatal编程技术网

C++ 旅行商的递推动态规划方法

C++ 旅行商的递推动态规划方法,c++,algorithm,recursion,dynamic-programming,C++,Algorithm,Recursion,Dynamic Programming,我希望有人能解释一下这个页面上的代码是如何工作的: 伪代码很难解释,而动态规划方法使其特别难以理解。为什么需要位移位?该方法如何推广(例如,给定位置坐标,我们是否可以调整该方法以解决该问题)?位移位是因为代码使用int表示一个集合,特别是访问城市的集合。如果您有32位整数,则int可以表示一组最多32项 基本操作是 // add n to set set |= 1 << n; // remove n from set set &= ~(1 << n); //

我希望有人能解释一下这个页面上的代码是如何工作的:


伪代码很难解释,而动态规划方法使其特别难以理解。为什么需要位移位?该方法如何推广(例如,给定位置坐标,我们是否可以调整该方法以解决该问题)?

位移位是因为代码使用int表示一个集合,特别是访问城市的集合。如果您有32位整数,则int可以表示一组最多32项

基本操作是

// add n to set
set |= 1 << n;

// remove n from set
set &= ~(1 << n);

// test set for n
if ((set&(1 << n)) != 0)
    ...
//将n添加到集合

set |=1变量
graph
是一个映射(在数学意义上)。给定两个城市A和B,
图[A][B]
是A到B的距离

变量
dp
是另一个映射。给定一组城市和一个城市a,
dp[S][a]
是访问S中每个城市并以a结束的最短行程

一旦填写了
graph
并选择了最终的城市,函数
init
将填写
dp
中的一些距离:对于每个城市A,从A开始只访问B的最短行程显然就是
graph[A][B]


函数
TSP(S,X)
给出访问S中每个城市的最短行程长度,并在X处结束。如果该距离已在
dp
中列出,则返回该距离。否则,对于S中的每个城市A,计算访问S中每个其他城市的最短行程长度,然后是A,然后是X。其中最短的是答案,因此函数将其记录在
dp
中并返回。

我强烈建议您参加topcoder SRM竞赛(www.topcoder.com/tc),这种问题在那里很常见