在 SCUT,Jimmy 的课表上有 N 门不同的课程,在学期的每一周内他总共会上 N 次课,每一门课程恰好一周上一次课,Jimmy 对于每一个课程都有一个熟练度,初始时都为 0。 对于一节课 Jimmy 可以选择如下两种选项之一: 1. 去上课:如果 Jimmy 选择去上课,此时他对于这节课的熟练度增加 � � A i 。 2. 翘课:Jimmy 热爱学习,因此他会在翘课的时候找地方自学,此时他对于这节课的熟练度增加 � � B i 。 为了去学习更多的课外知识,Jimmy 不会在其余时间学习这 N 门课程,但是他又不想要让自己的成绩排名靠后,于是他找到了你,请你帮忙让他在每周恰好翘 k 门课时,他所有课程熟练度总和尽可能大。 输入格式 第一行两个整数 N, k 接下来一行 N 个整数 � � A i 。 接下来一行 N 个整数 � � B i 。 输出格式 仅输出一行一个整数,表示 Jimmy 在每周恰好翘 k 门课时所有课程熟练度总和的最大值 样例数据 输入 3 2 19 4 5 2 6 2 输出 27写出代码
时间: 2024-02-12 08:06:37 浏览: 140
以下是Python代码实现:
```python
n, k = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
# 总课程数
N = n + k
# 初始化 dp 数组
dp = [[-float('inf')] * (N + 1) for _ in range(N + 1)]
dp[0][0] = 0
for i in range(1, N + 1):
for j in range(i + 1):
if j <= n and i - j <= k:
if j > 0:
dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + A[j - 1])
if i - j > 0:
dp[i][j] = max(dp[i][j], dp[i - 1][j] + B[i - j - 1])
print(dp[N][k])
```
其中,dp[i][j] 表示在前 i 门课程中恰好翘掉 j 门课程时的最大熟练度总和。根据题意,翘掉的课程数必须是 k,因此最终答案为 dp[n+k][k]。
在状态转移时,需要考虑当前这门课程是上还是翘掉。如果是上课,则转移方程为 dp[i][j] = max(dp[i][j], dp[i-1][j-1]+A[j-1]);如果是翘掉,则转移方程为 dp[i][j] = max(dp[i][j], dp[i-1][j]+B[i-j-1])。
最后,注意边界条件 dp[0][0] = 0,以及矩阵的大小为 (N+1)x(N+1)。
阅读全文