牛客\我不是大富翁\Python题解\动态规划

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客Q:Rabbit\rm\mathcal RabbitRabbit 拿到了一张环形的大富翁地图,地图被平均划分为了 nnn 个地块,地块的编号以 111 为起点,顺时针进行排布。即 111 号地块的顺时针方向依次为 222, 333, …\dots… 号地块;111 号地块的逆时针方向依次为 nnn, n−1n-1n−1, …\dots… 号地块(由于是环形的,所以 111 号地块与 nnn 号地块相邻,如下图所示)。

          \,\,\,\,\,\,\,\,\,\,游戏过程如下:系统会给定一个长度为 mmm 的行动力序列 a1,a2,…,ama_1,a_2,\dots,a_ma1​,a2​,…,am​ ,在第 iii (1≤i≤m1\le i \le m1≤i≤m) 回合,Rabbit\mathcal RabbitRabbit 都需要移动 aia_iai​ 个地块,但是他可以自由选择移动的方向(换句话说,可以自由选择是向逆时针还是顺时针方向移动 aia_iai​ 个地块)。
          \,\,\,\,\,\,\,\,\,\,在游戏的开始时,Rabbit\rm \mathcal RabbitRabbit 位于 111 号地块,他想知道是否存在这样一种移动方式,使得 mmm 个回合后他依旧在 111 号地块。

输入描述:

          \,\,\,\,\,\,\,\,\,\,每个测试文件仅有一组测试数据。
          \,\,\,\,\,\,\,\,\,\,第一行输入两个整数 nnn 和 mmm (1≤n1 \le n1≤n, m≤5000m \le 5000m≤5000) 表示地块数量和行动回合数。
          \,\,\,\,\,\,\,\,\,\,第二行输入 mmm 个整数 a1,a2,…,ama_1,a_2,\dots,a_ma1​,a2​,…,am​ (0≤ai≤2⋅1050\le a_i\le 2 \cdot 10^50≤ai​≤2⋅105) 表示行动力序列。

输出描述:

          \,\,\,\,\,\,\,\,\,\,如果 mmm 个回合后 Rabbit\rm  \mathcal RabbitRabbit 依旧在 111 号地块,则输出 YES\rm YESYES ;否则,请输出 NO\rm NONO 。您可以以任何大小写形式输出答案,例如,yEs\rm yEsyEs 、yes\rm yesyes 和 YeS\rm YeSYeS 都将被视为肯定的回答。

示例1

输入

复制360 3 120 120 120

360 3
120 120 120

输出

复制YES

n, m = map(int,input().split())
lst = list(map(int,input().split()))
#dp[i][j]代表第i步能否到达j+1地块 
#j == 0就是第一地块 也就是我们dp的目标dp[m][0]
dp = [[0]*(n) for i in range(m+1)]
dp[0][0] = 1
for i in range(1,m+1):
    for j in range(n): 
        #第i步能否到达取决与上一步(i-1步)的情况
        #第i逆时针
        if dp[i-1][(j - lst[i-1])%n] == 1:
            dp[i][j] = 1
        #第i步顺时针
        if dp[i-1][(j + lst[i-1])%n] == 1 :
            dp[i][j] = 1
if dp[m][0]:
    print('yes')
else:
    print('no')

通过时很激动,毕竟这是我第一次在竞赛中使用dp

虽然最后超时了,但以后还要加油!!!
        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值