池塘

来源:互联网 发布:apache 改变 127.0.0.1 编辑:程序博客网 时间:2024/04/24 20:31

题面

从前有两个青蛙王国,两个王国商业都非常繁荣。但是一块池塘阻碍了两国的商业往来。一次,两只青蛙在池塘的两岸,他们都希望到对岸去。我们可以将池塘看做一个n×m的矩形,在每个格子里,可能会有荷叶。青蛙必须踩在荷叶上,不能跳进水里。如图青蛙可以向他前方的5个有荷叶的地方跳去。
这里写图片描述

  由于有的地方荷叶比较小,当一个青蛙从该荷叶上跳走之后,荷叶会沉入水底,两个青蛙也不能同时跳上这种荷叶。两个青蛙想知道有多少种方式使他们都到达对岸。第一个青蛙可以从第一行任何一个有荷叶的格子出发。第二个青蛙可以从最后一行任何一个有荷叶的格子出发。当第一个青蛙到达最后一行任何一个有荷叶的格子时,他就算到达了对岸。当第二个青蛙到达第一行任何一个有荷叶的格子时,他也算到达了对岸。请你帮助青蛙们计算有多少种方案可以让他们都到达对岸。
  注:第一个青蛙只能向下跳,第二个青蛙只能向上跳。青蛙并不能跳出矩形区域。

分析

我们可以看成两个青蛙从下往上(从上往下)跳的方案数。
新建一个图,每个点连出最多5条边,并新建一个起点S,连向第一行所有有荷叶的点;新建一个终点T,最后一行所有有荷叶的点连向它。
f[i][j]为从ij的方案数(只考虑一只青蛙)。转移显然。
ans[i]为两只青蛙都到达i点的方案数,且路径上除了i点其他点都合法。显然ans[T]即为所求。那么我们怎么求ans数组呢?
我们可以用总方案数减去不合法的方案数。
总方案数ans[i]=f[S][i]f[S][i](两只青蛙)
然后我们枚举路线上经过的第一个不合法的地方j(j这个点只能有1只青蛙经过),ans[i]=ans[j]f[j][i]f[j][i]
这样问题就解决了。

1 0
原创粉丝点击