状态压缩,16位每位上为1表示已走,0表示没有走过,直接用位运算,表示所有的状态。
dp[i][j] 状态为i,最后一次是j的最小值,则由dp[i][j] + land[k][j] 推出dp[t][k] ,t表示,i把第k位置1的数。有2 ^ 16 * n个状态,n种转移,所以复杂度为o(2^16 * n * n);
第一种方法用spaf来解。
#define N 20
#define M 100005
#define maxn 205
#define MOD 1000000007
int n,land[N][N],T,m,a,b,c,dp[M][N],all,t;
queue q;
bool vis[M][N];
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while(S(T)!=EOF)
{
while(T--){
S2(n,m);
FI(n+1) FJ(n+1) land[i][j] = MOD,vis[i][j] = false;
FI(n+1) land[i][i] = 0;
all = 1<
第二种方法,用Floyed来解,由于n很小,可以很快处理出来。
#define N 20
#define M 100005
#define maxn 205
#define MOD 1000000007
int n,land[N][N],T,m,a,b,c,dp[M][N],all,t;
queue q;
bool vis[M][N];
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while(S(T)!=EOF)
{
while(T--){
S2(n,m);
FI(n+1) FJ(n+1) land[i][j] = MOD,vis[i][j] = false;
FI(n+1) land[i][i] = 0;
all = 1<