CSP - J组难题:小核桃数组规则谜题求解与代码详解
```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; const int MAXN = 100005; long long cnt[MAXN]; long long dp[MAXN]; int main() { int n; cin >> n; int num; for (int i = 0; i < n; i++) { cin >> num; // 统计每个数字出现的总和 cnt[num] += num; } // 动态规划计算最大得分 dp[0] = 0; dp[1] = cnt[1]; for (int i = 2; i < MAXN; i++) { // 状态转移方程:要么不选当前数字,最大得分等于前一个数字的最大得分;要么选当前数字,最大得分等于前两个数字的最大得分加上当前数字的总和 dp[i] = max(dp[i - 1], dp[i - 2] + cnt[i]); } // 最终结果是dp数组中的最大值 cout << dp[MAXN - 1] << endl; return 0; } ``` 代码解释 1. 统计数字总和: - 用`cnt`数组统计每个数字出现的总和。输入数字后,将对应数字的总和累加到`cnt`数组中。 2. 动态规划: - 定义`dp`数组,`dp[i]`表示处理到数字`i`时能获得的最大分数。 - 初始化`dp[0] = 0`,`dp[1] = cnt[1]`。 - 状态转移方程:`dp[i] = max(dp[i - 1], dp[i - 2] + cnt[i])`。表示要么不选当前数字`i`,最大得分等于前一个数字的最大得分;要么选当前数字`i`,最大得分等于前两个数字的最大得分加上当前数字的总和。 3. 输出结果: - 最终结果是`dp`数组中的最大值,即`dp[MAXN - 1]`。 复杂度分析 - 时间复杂度:$O(N + MAXN)$,其中$N$是输入数组的长度,$MAXN$是数字的最大值。 - 空间复杂度:$O(MAXN)$,主要用于存储`cnt`和`dp`数组。 ######[AI问答 | 555点数解答 | 2026-02-07 18:38:00]
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)230
- C++实现计算最少添加数字次数以匹配两个数组元素(字节豆包 | 714点数解答 | 2026-03-08 19:44:54)16
- 用 JS 实现网页猜数字游戏:1 - 100 随机数等你挑战!(百度文心 | 653点数解答 | 2025-03-26 14:39:33)239
- JS实现猜数字游戏:弹窗输入,1 - 100随机挑战,教你轻松上手!(百度文心 | 646点数解答 | 2025-03-26 14:49:43)200
- 融合道德感机制:女性NPC规则全面升级(字节豆包 | 1489点数解答 | 2025-06-20 20:06:34)157
- C++ 解决老师奖励同学铅笔数量问题:最少奖励方案揭秘(字节豆包 | 724点数解答 | 2025-12-06 20:58:32)46
- CSP - J/S 2024 第二轮分数线公布!编写程序计算二、三等奖分数线(GPT | 634点数解答 | 2024-11-22 23:39:24)233
- P1007:小核桃数组变换难题,Python代码揭秘最终平方和!(字节豆包 | 416点数解答 | 2026-02-07 18:24:18)45
- P1007小核桃数组变换难题:C++代码求解最终两数平方和! (字节豆包 | 651点数解答 | 2026-02-07 18:25:02)34
- CSP - J组难题破解:插班生入座对学生听课认真度总和的影响及C++实现(字节豆包 | 642点数解答 | 2026-02-07 18:26:52)32
- “天气之子”试炼:用代码破解天气预报成功天数之谜,复杂度分析揭秘!(字节豆包 | 797点数解答 | 2026-02-07 18:29:12)38
- 揭秘天气之子试炼:巧用算法计算天气预报成功天数(字节豆包 | 734点数解答 | 2026-02-07 18:30:34)31