代码拉取完成,页面将自动刷新
# -*- coding: utf-8 -*-
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/8/20
# @File : D - Leaping Tak(DP).py
def dp_leak_tak():
dp = [0] * (n + 1)
pre_fix = [0] * (n + 1)
dp[1] = 1
pre_fix[1] = 1#前缀和数组
for i in range(2, n + 1):
for seg in char:#遍历K个
x = max(0, i - seg[0])#这两句判断是否超出范围。
y = max(0, i - seg[1] - 1)#segment的两端点都是包含的,所以这要i - seg[1] - 1。
dp[i] += (pre_fix[x] - pre_fix[y]) % mod# 取模
pre_fix[i] = (pre_fix[i - 1] + dp[i]) % mod#维护一个前缀和数组(pre_fix[i]包含当前dp[i])
return dp[-1]
"""
基础线性DP,利用前缀和优化时间复杂度才能AC。
对于每一个n,都可以S里的不超过范围的i-d的位置跳过来,所以方法是这些的叠加。
但是会超时,要利用K的比较小的这个特点,就需要用到前缀和数组来获取每一段的和,前提是两端点不超出范围。
"""
if __name__ == "__main__":
n, k = map(int, input().split())
char = []
mod = 998244353
for _ in range(k):
a, b = map(int, input().split())
char.append((a, b))
res = dp_leak_tak()
print(res % mod)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。