用c++实现:Jimmy 作为一名 SCUT 的大学生,自然需要去学习。 在 SCUT,Jimmy 的课表上有 N 门不同的课程,在学期的每一周内他总共会上 N 次课,每一门课程恰好一周上一次课,Jimmy 对于每一个课程都有一个熟练度,初始时都为 0。 对于一节课 Jimmy 可以选择如下两种选项之一: 1. 去上课:如果 Jimmy 选择去上课,此时他对于这节课的熟练度增加 AiAi。 2. 翘课:Jimmy 热爱学习,因此他会在翘课的时候找地方自学,此时他对于这节课的熟练度增加 BiBi。 为了去学习更多的课外知识,Jimmy 不会在其余时间学习这 N 门课程,但是他又不想要让自己的成绩排名靠后,于是他找到了你,请你帮忙让他在每周恰好翘 k 门课时,他所有课程熟练度总和尽可能大。 输入格式 第一行两个整数 N, k 接下来一行 N 个整数 AiAi。 接下来一行 N 个整数 BiBi。 输出格式 仅输出一行一个整数,表示 Jimmy 在每周恰好翘 k 门课时所有课程熟练度总和的最大值,内存限制256MB,时间限制2s
时间: 2024-02-06 11:11:46 浏览: 266
scut深度学习手动实现正向cnn传播,使用numpy中的函数完成卷积模块,,并用在cifar10上
好的,下面是用 C++ 实现的代码,采用二维动态规划思想:
```c++
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 5010;
int n, k;
int a[N], b[N];
int f[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];
memset(f, -0x3f, sizeof f);
f[0][0] = 0;
for (int i = 1; i <= n; i ++ )
for (int j = 0; j <= k; j ++ )
{
// 不翘课
f[i][j] = max(f[i][j], f[i - 1][j] + a[i] + b[i]);
// 翘课
if (j) f[i][j] = max(f[i][j], f[i - 1][j - 1] + b[i]);
}
int res = -1e9;
for (int i = 0; i <= k; i ++ )
res = max(res, f[n][i]);
cout << res << endl;
return 0;
}
```
具体思路如下:
1. 定义 $f[i][j]$ 表示前 $i$ 门课,翘了 $j$ 门课时,所有课程熟练度总和的最大值。
2. 初始化 $f[0][0] = 0$。
3. 对于每一门课,有两种选择:
- 选择上课,则 $f[i][j] = f[i-1][j] + a[i] + b[i]$。
- 选择翘课,则 $f[i][j] = f[i-1][j-1] + b[i]$。
4. 最终答案为 $\max\limits_{i=0}^k f[n][i]$。
时间复杂度为 $O(nk)$,空间复杂度为 $O(nk)$。
阅读全文