1 Star 1 Fork 0

bensonrachel/Atcoder_algorithm

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
D - Leaping Tak(DP).py 1.24 KB
一键复制 编辑 原始数据 按行查看 历史
# -*- 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)
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/bensonrachel/atcoder_algorithm.git
git@gitee.com:bensonrachel/atcoder_algorithm.git
bensonrachel
atcoder_algorithm
Atcoder_algorithm
master

搜索帮助