用c++编写,假设给定一串数字{1,1,4,2,6,8,5},我们要从中选择若干个数,使最后的和达到最大。选择的规则是,不能选相邻的数字。比如:如果我们选了第一个数字1,那么我们就不能选2,如果我们选择了数字4,那么我们就不能选择与它相邻的1和2。
时间: 2024-11-05 07:25:16 浏览: 19
这是一个经典的动态规划问题,可以使用“0-1背包”策略来解决。这里是一个简单的 C++ 实现:
```cpp
#include <vector>
using namespace std;
int maxSumNoAdjacent(vector<int>& nums) {
int n = nums.size();
if (n == 0) return 0;
vector<vector<int>> dp(n, vector<int>(n, 0)); // 创建一个二维数组,存储以第i个位置结束的最大学术和
// 初始化边界条件
for (int i = 0; i < n; ++i) {
dp[i][0] = dp[i][1] = nums[i]; // 第一个位置可以选择,所以最大值就是本身
}
// 动态规划核心部分
for (int len = 2; len <= n; ++len) {
for (int start = 0; start + len - 1 < n; ++start) {
dp[start][len] = max({ // 每次选择是否加入当前元素
dp[start][len - 1], // 不加入
dp[start + 1][len - 1] // 加入下一个非相邻元素
});
if (start + 1 < len && dp[start + 1][len - 2] != 0) { // 如果可以选到一个非相邻元素
dp[start][len] = max(dp[start][len], dp[start + 1][len - 2] + nums[start + len - 1]); // 添加到总和
}
}
}
return dp[0][n]; // 返回最终的最大和
}
阅读全文