您的位置:首页 > 其它

【动态规划】【双调TSP与MTSP问题】 hdu2224 & hdu4281

2015-04-08 18:26 204 查看
一个月前写的了。。。。

首先双调TSP:hdu2224

给出平面上的N个点(1~N) 从 1 号点出发走到最右端的点 N 再返回 1  要求中途不能重复走某个点而且必须把所有点全走一遍 求最小的总路径

这个东西不是NPC 算导上有介绍O(N ^ 2)的算法。

dp[ i ][ j ]来表示从 1 到 i 以及从 1 到 j 的最小总路径 (i < j)

转移:

①当 i < j - 1时,dp[ i ][ j ]=dp[ i ][ j - 1 ]+dis[ j - 1 ][ j ]很显然由于i < j-1 ,dp[ i ][ j ]只能来源于dp[ i ][ j - 1 ]。

②当i = j - 1 时,dp[ j - 1 ][ j ]就可以来源于dp[ k ][ j -1 ] + dis[ k ][ j ](k < j - 1)

void solve()
{
dp[1][2] = dis[1][2];
for(int j = 3; j <= N; j++)
{
for(int i = 1; i < j - 1; i++)
{
dp[i][j] = dp[i][j-1] + dis[j - 1][j];
}
dp[j - 1][j] = inf;
for(int i = 1;i < j - 1; i++)
{
dp[j - 1][j] = min(dp[j - 1][j],dp[i][j - 1] + dis[i][j]);
}
}
dp

= dp[N - 1]
+ dis[N - 1]
;
}


MTSP:hdu4281

和上面那题差不多 不过这次就不是走一次了 是走多次。

那么这个就是要先完成每次的TSP 然后对于每个状态枚举子集 然后找到当前状态的最小费用

for(int i = 0; i < (1 << N); i++)
{
if(i & 1)
{
for(j = i & (i - 1); j; j = i & (j - 1))
res[i] = min(res[i], res[j | 1] + res[(i - j) | 1]);
}
}
return back[(1 << n) - 1];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: