【动态规划】【双调TSP与MTSP问题】 hdu2224 & hdu4281
2015-04-08 18:26
204 查看
一个月前写的了。。。。
这个东西不是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)
那么这个就是要先完成每次的TSP 然后对于每个状态枚举子集 然后找到当前状态的最小费用
首先双调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];
相关文章推荐
- HDU4281:Judges' response(mTSP问题)
- 经典动态规划算法-(TSP)双调欧几里得旅行商问题-hdu2224
- TSP问题 MTSP 双调TSP 商旅问题 中国邮差问题 担货郎问题
- 双调欧几里得旅行商问题 Bitonic_TSP poj 2677
- 算法导论15-1双调欧几里得旅行商问题 & 15-2整齐打印
- 双调旅行商问题 (Bitonic TSP)
- TSP(旅行者问题)——动态规划详解
- TSP(旅行者问题)——动态规划详解
- 【算法学习】双调欧几里得旅行商问题(动态规划)
- TSP问题——动态规划
- hdu 2224 双调欧几里得旅行商问题tsp
- TSP问题 动态规划实现
- 双调TSP问题总结---poj 2677和usaco5.4 canada tour
- 双调欧几里得旅行商问题【sicily 1163 && poj 2677.Tour】
- 动态规划求解TSP(旅行商)问题
- 【算法学习】双调欧几里得旅行商问题(动态规划)
- 双调旅行商问题(TSP)bitonic tours
- 【算法学习】双调欧几里得旅行商问题(动态规划)
- HDU2224 TSP(货郎担)问题DP
- 动态规划 解TSP旅行商问题