在 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写出C++代码
时间: 2024-02-12 20:06:37 浏览: 143
电力系统通信课程设计报告scut样本.doc
以下是C++代码实现:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int N = 110;
int n, k;
int A[N], B[N];
int dp[N][N];
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i ++ ) cin >> A[i];
for (int i = 1; i <= n; i ++ ) cin >> B[i];
// 总课程数
int N = n + k;
// 初始化 dp 数组
memset(dp, -0x3f, sizeof dp);
dp[0][0] = 0;
for (int i = 1; i <= N; i ++ )
for (int j = 0; j <= i; j ++ )
{
if (j <= n && i - j <= k)
{
if (j > 0) dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + A[j]);
if (i - j > 0) dp[i][j] = max(dp[i][j], dp[i - 1][j] + B[i - j]);
}
}
cout << dp[N][k] << endl;
return 0;
}
```
需要注意的是,C++中的数组下标从0开始,因此需要将状态转移方程中的 j 和 i-j 改为 j+1 和 i-j+1。
另外,初始化 dp 数组时需要使用 memset 函数将其全部赋值为负无穷,因为最终答案可能不为非负整数,而且也不能用 0 来初始化,因为当不选任何一门课程时,dp[0][0] 应该为 0。
阅读全文