题解 | [NOIP2002 普及组] 过河卒 Python3

[NOIP2002 普及组] 过河卒

https://www.nowcoder.com/practice/cc1a9bc523a24716a117b438a1dc5706

import sys

# 23:28

# 动态规划 dp[i][j]为从 (0,0)到 (i,j)的条数
# 可以从上面来,也可以从左边来
# dp[i+1][j] = dp[i][j] + dp[i+1][j-1],且 (i,j), (i+1,j-1)不为马能吃掉的点,否则不加该点

n, m, x, y = list(map(int, input().split()))

dp = [[0]*(m+1) for _ in range(n+1)]

dp[0][0] = 1

# 初始化dp[0][i]

for i in range(1,m+1):
    # 第一行,只能从右边走
    if (abs(0-x) + abs(i-y) == 3 and x!=0 and y!=i) or (x==0 and y==i):
        # 遇到马范围,不能走
        dp[0][i] = 0
    else:
        dp[0][i] = dp[0][i-1]

for i in range(1,n+1):
    # 第一列,只能从下边走
    if (abs(i-x) + abs(0-y) == 3 and x!=i and y!=0) or (i==x and y==0):
        # 遇到马范围,不能走
        dp[i][0] = 0
    else:
        dp[i][0] = dp[i-1][0]

for i in range(1,n+1):
    for j in range(1,m+1):
        # 如果(i,j)在马能吃到的范围内,或者为马。直接什么都不处理
        if (abs(i-x) + abs(j-y) == 3 and x!=i and y!=j) or (x==i and y==j):
            continue           
        dp[i][j] = dp[i-1][j] + dp[i][j-1]

print(dp[-1][-1])

全部评论

相关推荐

11-17 11:15
门头沟学院 Java
金山办公终于发offer了,但薪资和平台都不如已有的offer打算拒了,A不了薪资,不满意直接拒了,留给需要的人嘿嘿嘿时间线:10.14线下一面 ,10.23线上二面,下午发测评,11月1日HR面,11月14日电话谈薪,11月17日直接发offer
star__plat...:好兄弟干的好啊,解气。金山第一次笔难度高的离谱,第二次简单的离谱全A了,用人部门筛选中估计最后还是要挂我,就这今早智联招聘还给我发信息让我投
offer帮选
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务