给定一个长度为
n 的数组,需要对数组进行
k 次如下操作:
挑选数组中的一个元素,把它移除掉,并把这个值作为获取到的价值,同时会付出相应的代价,就是把数组中剩下的所有元素都减去2,但是元素最小只能变成0。
问最终
k 次操作下来之后,能够获取到的最大价值是多少?
给定一个长度为
n 的数组,需要对数组进行
k 次如下操作:
挑选数组中的一个元素,把它移除掉,并把这个值作为获取到的价值,同时会付出相应的代价,就是把数组中剩下的所有元素都减去2,但是元素最小只能变成0。
问最终
k 次操作下来之后,能够获取到的最大价值是多少?
EternalLBZ 晚上好🌙🌙🌙
本答案参考ChatGPT-3.5
问题可以通过动态规划来解决。下面是解决问题的思路:
代码实现:
#include <iostream>
#include <vector>
using namespace std;
int getMaxValue(vector<int>& nums, int k) {
int n = nums.size();
vector<int> dp(k+1, 0); // dp数组,初始值都为0
for (int i = 1; i <= k; i++) {
int maxValue = 0; // 当前操作下的最大价值
for (int j = 0; j < n; j++) {
int value = nums[j]; // 移除的元素值
int sum = 0; // 移除元素后剩下元素的和
for (int m = 0; m < n; m++) {
if (m != j) {
nums[m] -= 2; // 将剩下的元素都减去2
if (nums[m] < 0) nums[m] = 0; // 元素最小值为0
sum += nums[m];
}
}
int totalValue = value + sum; // 当前操作下的总价值
maxValue = max(maxValue, totalValue); // 更新最大价值
// 还原数组的值
for (int m = 0; m < n; m++) {
if (m != j) {
nums[m] += 2;
}
}
}
dp[i] = maxValue;
}
return dp[k];
}
int main() {
int n, k;
cin >> n >> k;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
int maxValue = getMaxValue(nums, k);
cout << maxValue << endl;
return 0;
}
时间复杂度分析:每次操作都需要对数组进行遍历,所以时间复杂度为 O(kn^2)。
希望能帮到你!