哈密顿回路, DP解法

题目链接:https://www.patest.cn/contests/gplt/L3-015
简介:哈密顿路除了暴搜,当然还可以DP,只不过需要2n的空间,复杂度是O(n*(2n)), 暴搜不需要那么多,但复杂度为O(n!)。
ACFUN群里的讲解:

因为是个环肯定 1 是第一个点
然后你就找一条链就行了,dp[mask][i] 表示 mask 集合的最后一个点是 i 的路径是否存在
第二维还可以压位不过这个不重要

所以这实际上就是求个排列dp。
排列dp相关题目:http://www.jianshu.com/p/fdf03a78176b 的2题3题。
但这题还是有几个坑点:

  1. i胜过j 是 tb[i][j]=='W'||tb[j][i]=='L' ,tb[i][j] 和tb[j][i] 不相关。
  2. n的范围好像是21...
  3. 打印路径还是有难度和坑点的,首先逆推建能到终点的路径图,然后从起点正推,坑点就是假设每个子集为图上的点,每次选则的球队为边,并不是只要到达这结点,由这结点出发的任意边的任意边都可以选,还和你到这点最后走的边有关
    代码
#include
#include
#include
#include
using namespace std;
const int MAXS = 1<<21;
const int MAXN = 21;
const int INF = 0x3f3f3f3f;
typedef pair pii;
int dp[MAXS], G[MAXS][MAXN], n;
char tb[MAXN][MAXN];
inline bool win(int x, int y) {
    return tb[x][y]=='W'||tb[y][x]=='L';
}
inline bool of(int x, int st) {
    return (1< q;
    while(q.size()) q.pop();
    memset(G, 0x3f, sizeof(G));
    int t=(1<

你可能感兴趣的:(哈密顿回路, DP解法)