我无法解决如何选择元素的问题。
所以,我想总的来说
如果我们选择2个连续的元素Arr[i]和Arr[i+1],
然后我们不能从接下来的3个值Arr[i+2]、Arr[i+3]、Arr[i+4]中选择,我们只能从Arr[i+5]中选择
取第4、5和9位的值
即500+900+100=1500
另一个例子:
即700+900+700+500=2800
对我来说,这可以通过对动态规划算法的简单修改来实现。实际上,您可以添加一个变量来指示最后一个元素是否被选中。假设您正在考虑位于idx位置的元素,您需要一个变量来告诉您是否选择了idx-1:(1)如果不是,您还没有选择任何连续的,您可以在idx+1继续,(2)如果是,您应该从idx+4开始,因为不再允许选择idx+1、idx+2、idx+3。
下面是C++中的一个实现:
const int n = 1000;
int arr[n];
int dp[n][2];
bool mark[n][2];
int rec(int idx, bool idx_minus1_picked){
if(idx >= n){
return 0; // we have reached end of array
}
if(mark[idx][lidx_minus1_picked]){
return dp[idx][idx_minus1_picked];
}
int &ret = dp[idx][idx_minus1_picked];
ret = 0;
if(idx_minus1_picked){
//get the maximum between picking or not picking arr[idx]
ret = max(arr[idx] + rec(idx + 4, false), rec(idx + 1, false));
}
else{
ret = max(arr[idx] + rec(idx + 1, true), rec(idx + 1, false));
}
return ret;
}
int main(){
int answer = rec(0, false);
return 0;
}
链接到HackerRank挑战 我的想法是遍历数组,每次求和数组中除一个元素外的所有元素,然后求最小和最大和。 所以对于给定的数组 我应该得到以下可能的“块”: ,,,,。 和最小的块是。 我如何调整我的代码来获得给定数组中所有可能的4位数数组,以便我可以比较它们的和,仍然使用for-loop?或者,如果不使用for循环,您还会建议什么? 编辑:现在使用和获取数组中最小和最大的元素。然后使用删除这
你是一个电视游戏节目的参与者,这给了你赢得奖金的机会。在游戏中,你会看到一系列框,每个框都包含一个允许你看到的正整数值。你有机会选择任何数量的盒子。您的总奖金是您选择包含的所有盒子的总和。这个游戏只有一个限制:如果你选择了两个连续的盒子,你不允许在总数中添加任何后续的盒子,而你的奖品是截至该点的累计金额。你的目标是最大化你的奖金。 给定一个正整数数组,代表游戏中呈现给你的每个盒子的值,返回你能赢得
给定一个由n个非负整数组成的数组(ARR[]),我们必须找到元素的最小和,以便每3个连续元素中至少有一个被选中。 请解释所形成的递归方程背后的直觉。为什么添加当前的第i个第数组元素和最后三次递归调用的结果的最小值会给出大小为i的数组的正确答案呢?
本文向大家介绍求一个数组中连续子向量的最大和相关面试题,主要包含被问及求一个数组中连续子向量的最大和时的应答技巧和注意事项,需要的朋友参考一下 考察点:数组
O(n^2)算法简单。有没有人对此有更好的算法?
问题内容: 我有这张表 language_id是指记录所用的语言。我想做的是检索 每个language_id中 最近的五个记录(ORDER BY time_posted DESC LIMIT 5)的列表。我可以使用许多不同的SQL查询在PHP中循环执行此操作,但我觉得有一种更简单的方法。 我必须得到一本有关SQL的书,哈哈。 谢谢。 问题答案: 这是我在MySQL中解决此“每组前N个”类型的查询的