动态规划的代码好优雅,看着是一种享受
发布人:zzk · 发布于 2026年8月13日 13:55
https://atcoder.jp/contests/abc438/tasks/abc438_d
代码实现起来不难, 就是想着太难了,初始化和动态规划转移方程暂且不论,这道题为什么要动规呀?Why,就这道题,我的反应肯定是数学建模,然后前缀和+减小自由量, 这个思考是可以的,也AC了。但感觉不如动规来的直观优雅。
但是到底为什么要动规呀,所以说动态规划很难学,思维曲线是陡的,只能说,算法直觉?
``` python
import math
import sys
def main():
n = int(sys.stdin.readline().strip())
arr = list(map(int, sys.stdin.readline().strip().split()))
brr = list(map(int, sys.stdin.readline().strip().split()))
crr = list(map(int, sys.stdin.readline().strip().split()))
dp = [ [-math.inf] * 3 for _ in range(n + 1)]
# 第一个元素必须是a
dp[1][0] = arr[0]
for i in range(1, n):
a = arr[i]
b = brr[i]
c = crr[i]
idx = i + 1
# 保持拿a
dp[idx][0] = a + dp[idx - 1][0]
# 拿b,刚开始拿b
b2 = b + dp[idx - 1][0]
# 拿b,持续拿b
b1 = b + dp[idx - 1][1]
dp[idx][1] = max(b1, b2)
# 拿c, 刚开始拿c
c1 = c + dp[idx - 1][1]
# 拿c, 持续拿c
c2 = c + dp[idx - 1][2]
dp[idx][2] = max(c1, c2)
print(dp[n][2])
if __name__ == "__main__":
main()
```