poj 3311(floyd+状态压缩)
题目链接:http://poj.org/problem?id=3311
思路:Floyd + 状态压缩DP
题意是有N个城市(1~N)和一个PIZZA店(0),要求一条回路,从0出发,又回到0,而且距离最短 (可重复走).
首先不难想到用FLOYD先求出任意2点的距离dis[i][j] 。
接着枚举所有状态,用11位二进制表示10个城市和pizza店,1表示经过,0表示没有经过 。
定义状态DP(S,i)表示在S状态下,到达城市I的最优值 。
接着状态转移方程:DP(S,i) = min{DP(S^(1<<i-1),k) + dis[k][i],DP(S,i)},器重S^(1<<i-1)表示未到达城市i的所有状态,1<=k<=n 。
对于全1的状态,即S = (1<<n)-1则表示经过所有城市的状态,最终还需要回到PIZZA店0 。
那么最终答案就是min{DP(S,i) + dis[i][0]} 。