USACO 6.5 Betsy's Tour dp做法

上课时感觉有dp做法 就搓了搓试试

原题是说有一个n*n的矩阵 让你从左上角走到左下角 也就是求一个哈密顿路

但我不会求哈密顿路) 

尝试在左上角和右下角之间加一条新路径然后求哈密顿回路

然后我们把这张图旋转90度(旋转是因为我一开始思考的时候搞错了方向)

图变成这个样子

 

对于一个格子 我们思考 他有四个方向可以延伸 而且就如同水管 延伸出去的管一定是接在一起的

(如同下图)

 

 假若红色是已经确定的走法 则蓝色一定会走 (更舒服的说法就是一定会有别的路径和他接起来)

(嗯这非常圆满 因为他是哈密顿回路)

 然后我们考虑括号匹配0表示没有延伸 1表示( ,2表示)

这里我们钦定一个格子(i,j)对(i+1,j)影响为1

一个格子(i,j)对(i,j+1)影响为2

然后对于一个格子 如果我们想转移这个格子 需要得知他上面和左面的延伸情况 也就是说我们要从上到下 从左到右进行枚举(简单易懂)

然后我们分类讨论

对于上面和左面都没有延伸:

 

 (他看起来不太高兴

上面和左面都没有延伸 而这个格子需要被经过 所以这个格子一定会对下面和右面延伸

然后我们思考左面有延伸:

 

可以选择过继到右面(注意这里是过继 所以是继承前面的代价 而不是代价为1)

 

当然也可以过继到下面(注意这里也是过继)

对于只有上面有影响的当然也一样(显而易见)

然后我们思考上面和左面都有影响

如果上面影响为1 左面影响为2 (那只是简单的绕了一圈,直接删掉就好)

如果上面影响为2 左面影响为1 (恭喜你跑完了 这种情况只会出现在右下角 也就是我们跑的最后一步)

如果上面左面都为1(虽然都为1但他们都有影响 当然是选择连起来。连起来之后把那个完备的吃掉)

(正常说的话就是沿着上面的影响走 走到它对应的右括号,吃掉这个右括号把它变成左括号)

上面左面都为2则沿着左面吃掉左括号

然后就做完了(

根据这个东西来dp 可能状态不太好存 可以把一条线上的状态转化成数字然后用哈希存储(

(自测能过n=12)

 

posted @ 2022-12-08 21:18  lichangjian  阅读(52)  评论(0编辑  收藏  举报