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

一个月前写的了。。。。


首先双调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[N][N] = dp[N - 1][N] + dis[N - 1][N];
}


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];




你可能感兴趣的:(动态规划)