题目描述
个人在做传球的游戏,编号为 。
游戏规则是这样的:开始时球可以在任意一人手上,他可把球传递给其他人中的任意一位;下一个人可以传递给未接过球的任意一人。
即球只能经过同一个人一次,而且每次传递过程都有一个代价;不同的人传给不同的人的代价值之间没有联系;
求当球经过所有 个人后,整个过程的最小总代价是多少。
输入格式
第一行为 ,表示共有 个人( );
以下为 的矩阵,第 行、第 列表示球从编号为 的人传递到编号为 的人所花费的代价,特别的有第 行、第 列为 (因为球不能自己传给自己),其他数据均为正整数( )。
输出格式
一个数,为最小的代价总和。
这其实是一道很简单的状压 。
表示在 的二进制状态下( 表示已经传过了),当前的球在 号人手里的最小代价总和。
考虑球从
传到
(
之前没有传过球):
代码实现如下:
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]);
}
}
}
}