TYVJ 1061 Mobile Server

来源:互联网 发布:怎么能投诉淘宝卖家 编辑:程序博客网 时间:2024/06/07 11:44

Mobile Service

 

描述 Description

 

一个公司有三个移动服务员。如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动。被请求后,他才能移动,不允许在同样的位置出现两个员工。从p到q移动一个员工,需要花费c(p,q)。这个函数没有必要对称,但是c(p,p)=0。公司必须满足所有的请求。目标是最小化公司花费

 

输入格式 Input Format 

 

第一行有两个整数L,N(3<=L<=200, 1<=N<=1000)。L是位置数;N是请求数。每个位置从1到L编号。下L行每行包含L个非负整数。第i+1行的第j个数表示c(i,j) ,并且它小于2000。最后一行包含N个数,是请求列表。一开始三个服务员分别在位置1,2,3。

 

 

输出格式 Output Format  一个数M,表示最小服务花费。 

Sample Inout

 

5 9
0 1 1 1 1
1 0 2 3 2
1 1 0 4 1
2 1 5 0 1
4 2 3 4 0
4 2 4 1 5 4 3 2 1

 

Sample Output

 

5

 

——————————————分割线一号————————————

分析

        毫无疑问,怎么看都是相当标准的动归题,通览题目,略加思考就可以得出无脑强行递推的结论,再无脑分析一下,大概时空都是1000×200×200×200 ,于是乎又自然而然的想到了降维。


降维

       神马四边形不等式,单调队列都是浮云,可以留意到如果我们设当前进行到了第i步,三个人分别位于x1,x2,x3那么接下来的选择就是将三个人中的任意一个移动到第i+1步的指定位置,不妨记为p[i+1],即此,可以发现三个人中的一个人的位置是不需要枚举的,这个人的位置直接由当前的步数 i 决定,至此,降维成功,如下

 

               f[i,某人位置,某人位置,某人位置]=f[i,某人位置,某人位置]

 

 由 f[i,x1,x2],可以推倒出如下情况

          1.将本来在p[i]的人移动到p[i+1]去,即

              f[i+1,x1,x2]=f[i,x1,x2]+movecost(p[i],p[i+1]);

              f[i+1,x2,x1]=f[i,x1,x2]+movecost(p[i],p[i+1]);

          2.将本来在x1位置的人移动到p[i+1]去,即

              f[i+1,p[i],x2]=f[i,x1,x2]+movecost(x1,p[i+1]);

              f[i+1,p[i],x2]=f[i,x1,x2]+movecost(x1,p[i+1])

          3.将本来在x2位置的人移动到p[i+1]去,跟情况2差不多了...

 

细则

        空间不够:直接使用递推神器——滚动数组

        初始化:使用滚动数组的话,要手动计算第一组的移动情况

        冲突:有可能出现2人在一个地方的冗余情况以及不需要移动就可以满足的情况


——————————我是分割线2号————————

 

Code: