c++编写:给定一个长度为n的数组a,你可以对a进行k次如下操作:删除数组第一个元素或者删除最后一个元素。求最后得到的数组和的最大值。 输入:第一行输入n,k 第二行输入n个正整数表示a数组,第i个数为ai。 输出:一个非负整数,表示最后得到数组和的最大值。的代码
时间: 2024-09-20 12:18:01 浏览: 70
有一个int数组{1,3,5,-2,4,6},要求获取:最大值、最小值、元素和、平均值
5星 · 资源好评率100%
这个问题可以使用动态规划的方法来解决,我们维护两个状态:dp[i][j] 表示前 i 个元素经过 j 次操作后的最大和,这里 i 是数组的索引范围,j 是剩余的操作次数。
对于每个状态 dp[i][j],有两种情况:
1. 如果选择保留当前元素 a[i],则下一次操作可以从 i+1 开始,所以 dp[i][j] = max(dp[i+1][j], dp[i+1][j-1] + a[i]);
2. 如果选择删除当前元素 a[i],则下一次操作仍然从 i+1 开始,因为已经用掉了一次操作,所以 dp[i][j] = dp[i+1][j-1]。
初始状态为 dp[0][0] = 0 和 dp[0][1] = a[0],然后遍历整个数组。
以下是 C++ 代码实现:
```cpp
#include <iostream>
using namespace std;
int maxSum(int n, int k, vector<int>& a) {
if (n == 0 || k == 0) return 0;
vector<vector<int>> dp(n + 1, vector<int>(k + 1));
dp[0][0] = 0;
if (k >= 1) dp[0][1] = a[0];
for (int i = 1; i <= n; ++i) {
dp[i][0] = dp[i - 1][0];
dp[i][1] = max(dp[i - 1][0], dp[i - 1][1] + a[i]);
for (int j = 2; j <= k; ++j) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + a[i]);
}
}
return dp[n][k];
}
int main() {
int n, k;
cin >> n >> k;
vector<int> a(n);
for (int& ai : a) cin >> ai;
cout << "最大和为: " << maxSum(n, k, a) << endl;
return 0;
}
```
阅读全文