给定 n 个数字构成的序列 a1,a2,a3,…… 请从中挑选一些数字构成一个独立集。所谓独立集就是原数列的一部分数字,且这些数字在原数列中均不相邻。找出数字之和最大的独立集,输出这些数字的和。注意若数字都是负数,可以不挑任何数,此时输出 0。完整c++代码
时间: 2024-10-03 13:03:53 浏览: 74
【数据可视化】按照给定的数据集,采用Python可视化软件,独立完成一个数据可视
这是一个经典的动态规划问题,可以使用滑动窗口(Sliding Window)算法解决。在C++中,你可以创建一个数组`dp`来存储当前长度独立集的最大和,其中`dp[i]`表示以第`i`个数字结尾的最大独立集和。
下面是C++代码的一个示例:
```cpp
#include <vector>
using namespace std;
int maxNonAdjacentSum(vector<int>& nums) {
int n = nums.size();
if (n == 0 || (n > 0 && nums[0] <= 0)) {
return 0;
}
vector<int> dp(n);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for (int i = 2; i < n; ++i) {
dp[i] = max({dp[i - 1], dp[i - 2] + nums[i]});
}
return dp[n - 1];
}
// 示例
int main() {
vector<int> nums = {1, 2, -1, 3, 6};
cout << "Max sum of non-adjacent numbers: " << maxNonAdjacentSum(nums) << endl;
return 0;
}
```
在这个代码中,我们初始化`dp`数组的前两个元素为`nums[0]`和`max(nums[0], nums[1])`,然后遍历剩余的元素,每次更新`dp[i]`时,考虑是否包括当前元素(`dp[i - 1]`)或者上一个元素(`dp[i - 2] + nums[i]`)。最后返回的就是最大独立集的和。
阅读全文