2010 年世博会在中国上海举办吸引了数以千万计的中外游客前来参观。暑假期间小 Z 也来到了上海世博园 她对世博园的拥挤早有所闻对有的展馆甚至要排上好几个小时的队才能进入也做好了充分准备但为了使得自己的世博之旅更加顺利舒畅小 Z 决定在游玩之前先制定一份详细的旅行路线。小 Z 搜集到了世博园的地图她发现从整体上看世博园是一块非常狭长的区域而每一个展馆占用了其中一个几乎相同大小的方块。因此可以将整个
根据题目要求,小 Z 希望交替参观热门馆和普通馆,并且在游览过程中不走冤枉路。我们可以使用动态规划的方法来解决这个问题。
首先,我们定义一个三维数组 dp,其中 dp[i][j][k] 表示从起点 (1, 1) 到位置 (i, j) 且当前参观的是第 k 个展馆的所有路线总数。为了方便计算,我们将矩阵的行数和列数都扩大一倍,变成 2n 和 2m。
然后,我们根据题目要求和动态规划的思路来计算 dp 数组。具体来说,我们可以使用以下递推关系式:
dp[i][j][k] = dp[i-1][j][k-1] + dp[i+1][j][k-1] + dp[i][j-1][k-1] + dp[i][j+1][k-1]
其中,dp[i-1][j][k-1] 表示从位置 (i-1, j) 参观完第 k-1 个展馆后,移动到位置 (i, j) 参观第 k 个展馆的路线总数;同理,dp[i+1][j][k-1]、dp[i][j-1][k-1] 和 dp[i][j+1][k-1] 分别表示从其他三个方向移动到位置 (i, j) 参观第 k 个展馆的路线总数。
然后,我们对 dp[i][j][k] 进行取模运算,即 dp[i][j][k] = dp[i][j][k] mod 11192869,以防止结果过大。
最后,我们需要计算的结果是所有 dp[n][m][k] 的和,其中 k 为 0 到 1 的所有展馆的个数。即结果为 sum(dp[n][m][k]),其中 k 为 0 到 1 的所有展馆的个数。
以下是具体的代码实现:
def travel(n, m, L):
# 定义动态规划数组
dp = [[[0] * (len(L) + 1) for _ in range(2*m+1)] for _ in range(2*n+1)]
# 初始化边界条件
for i in range(1, 2*n+1):
for j in range(1, 2*m+1):
if i % 2 != 0 or j % 2 != 0:
dp[i][j][0] = 1
# 计算动态规划数组
for k in range(1, len(L)+1):
for i in range(1, 2*n+1):
for j in range(1, 2*m+1):
if L[k-1] == 0:
dp[i][j][k] = (dp[i-1][j][k-1] + dp[i+1][j][k-1] + dp[i][j-1][k-1] + dp[i][j+1][k-1]) % 11192869
else:
dp[i][j][k] = dp[i][j][k-1]
# 计算结果
result = sum(dp[2*n][2*m])
return result % 11192869
通过调用 travel(n, m, L) 函数,其中 n 和 m 分别为矩阵的行数和列数,L 为长度为 n*m 的 01 序列,即可得到结果。
注意:以上代码的时间复杂度为 O(n * m * len(L)),在输入规模较大时可能会超时。可以考虑使用空间优化的方式,将三维数组 dp 转化为二维数组来减少空间复杂度
原文地址: https://www.cveoy.top/t/topic/h4cN 著作权归作者所有。请勿转载和采集!