学到了,我得到了一个线性动态规划的模型。
以防万一,我还是先把旅行商问题简化版的题意简要说明一下。
原本的旅行商问题是在一圈城市之间找到最短回路访问各城市有且仅有一次。现在添加了限制:对于每个城市,所有标号比该城市小的城市要么全部访问过要不全部没有访问。这样我们对于整体的访问队列能够得到一个抽象的双向队列。
首先添加1,1是固定的。
1
然后添加2,2的位置可以在1前面也可以在1后面。
1 2
2 1
这两种情况都是合法的,然后我们添加3,3的位置也可以在队列的前面或者后面但是不能在队列中间。
3 1 2
1 2 3
3 2 1
2 1 3
在n等于3的情况下有且只有这4种合法情况。对于接下来的压入行为,对状态有影响的只有队列两端的元素。所以我们定义状态为( i , j ),表示队列两段分别为i和j且i是当前队列中最大的元素时最小的花费,始终保持i大于j。(第二种情况和第三种情况是等效的)于是我们得到状态转移方程。
dp[i+1][j]=min(dp[i+1][j],dp[i][j]+dis[i+1][i]); dp[i+1][i]=min(dp[i+1][i],dp[i][j]+dis[i+1][j]);
规模为n的问题实际上只用n-1个有效可行解。
然后对于最后求解,我们在
dp[n][i](i<n)
中求最小值即可。