NKOJ P1752 传球游戏【状态压缩】

题目描述

n 个人在做传球的游戏,编号为 1 n
游戏规则是这样的:开始时球可以在任意一人手上,他可把球传递给其他人中的任意一位;下一个人可以传递给未接过球的任意一人。
即球只能经过同一个人一次,而且每次传递过程都有一个代价;不同的人传给不同的人的代价值之间没有联系;
求当球经过所有 n 个人后,整个过程的最小总代价是多少。

输入格式

第一行为 n ,表示共有 n 个人( 16 >= n >= 2 );
以下为 n 2 的矩阵,第 i + 1 行、第 j 列表示球从编号为 i 的人传递到编号为 j 的人所花费的代价,特别的有第 i + 1 行、第 i 列为 1 (因为球不能自己传给自己),其他数据均为正整数( <= 10000 )。

输出格式

一个数,为最小的代价总和。


这其实是一道很简单的状压 D P

f [ i ] [ j ] 表示在 i 的二进制状态下( 1 表示已经传过了),当前的球在 j 号人手里的最小代价总和。

考虑球从 j 传到 k k 之前没有传过球):

f [ i | ( 1 << ( k 1 ) ) ] [ k ] = m i n   f [ i ] [ j ] + c o s t [ j ] [ k ]

代码实现如下:

for(I=0;I<=T;I++){
    for(J=1;J<=N;J++){
        DP[I][J]=Inf;
    }
}
for(I=1;I<=N;I++){
    DP[1<<(I-1)][I]=0;
}
for(I=0;I<=T;I++){
    for(J=1;J<=N;J++){
        for(K=1;K<=N;K++){
            if((I>>(K-1)&1)==0){
                DP[I|(1<<(K-1))][K]=min(DP[I|(1<<(K-1))][K],DP[I][J]+Cost[J][K]);   
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/yanzhenhuai/article/details/81569203
今日推荐