斯坦纳树裸题
状压dp,dp[i][j][Mask]表示当前在(i,j),当前已经在树中的节点为Mask的最小代价
两种转移
1. dp[i][j][Mask]=min(dp[i][j][Mask],dp[i][j][sub]+dp[i][j][Mask-sub])
2. dp[i][j][Mask]=min(dp[i][j],dp[i'][j'][Mask]+score[a[i][j]]),其中(i,j)和(i',j')相邻,这个可以用spfa转移
注意若干相同的字母连通是一块石头,所以spfa的时候注意一下
注意最后求的不是一棵斯坦纳树而是一个斯坦纳森林
所以还要再来一个dp,DP[Mask]表示在Mask状态下最少多少代价可以生成斯坦纳森林
DP[Mask]=min(DP[Mask],dp[i][j][Mask],DP[sub]+DP[Mask-sub]),其中sub和Mask-sub要是合法Mask,即要求相连的点对要成对出现
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <utility>
#include <cctype>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <cmat