C++ 使用递归到达序列末尾的最小跳转次数
我有一个“使用递归到达数组末尾的最小跳跃次数”的代码但我无法打印序列。(vector vec中没有要打印的内容)C++ 使用递归到达序列末尾的最小跳转次数,c++,algorithm,c++11,c++14,dynamic-programming,C++,Algorithm,C++11,C++14,Dynamic Programming,我有一个“使用递归到达数组末尾的最小跳跃次数”的代码但我无法打印序列。(vector vec中没有要打印的内容) 任何帮助都将不胜感激 说明: 我想从第一个元素(即2)到 最小跳跃中数组的最后一个元素(即4) 如何跳转: 第一个元素是2。这意味着我最多可以在阵列中进行2次跳跃。如果我跳第一步,那么我可以达到第二个元素(即3),或者如果我跳第二步 第二次跳跃之后,我可以到达第三个元素(即1) 第二个元素是3,所以我最多可以跳3次。在第一跳我可以达到1,在第二跳我可以达到0,在第三跳我可以 达到4
任何帮助都将不胜感激 说明:
我想从第一个元素(即2)到 最小跳跃中数组的最后一个元素(即4)
如何跳转:
第一个元素是2。这意味着我最多可以在阵列中进行2次跳跃。如果我跳第一步,那么我可以达到第二个元素(即3),或者如果我跳第二步 第二次跳跃之后,我可以到达第三个元素(即1)
第二个元素是3,所以我最多可以跳3次。在第一跳我可以达到1,在第二跳我可以达到0,在第三跳我可以 达到4
通过这种方式,我希望以最小跳跃次数从数组的第一个元素到达最后一个元素。
所以输出将是,从第一个元素2,我将跳到3。然后从3跳到4(最后一个元素)。所以跳了两次。(2-3-4) 预期产量
Number of jumps 2
Sequence is 2 3 4
下面的示例将设置一个向量,其中每个索引在访问该索引后在序列中存储正确的下一步。我让您使用结果向量按照从第一个元素到最后的顺序进行编码。我还将此条件
if(arr[start]==0)
更正为返回“无穷大”,因为如果我们访问此元素,则无法完成序列
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
int jump(int arr[], int n, int start, vector<int> &vec)
{
if(start == n-1) // if start is the last element in array
return 0;
if( arr[start] == 0) // if array element is 0
return INT_MAX - n;
int minimum = INT_MAX;
int step;
for( int i = 1 ; i <= arr[start]; i++ )
{
int _jump = 1 + jump( arr, n, start+i, vec); // considering every jump
if (_jump < minimum){
minimum = _jump;
step = start + i;
}
}
vec.at(start) = step;
return minimum;
}
int main()
{
int arr[] = { 2, 3, 1, 0, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
vector<int> vec(n, -1);
cout << "Number of jumps " << jump(arr, n, 0, vec) << endl;
cout<<"Vector: "<<endl;
for( auto x : vec)
cout << x <<" ";
return 0;
}
#包括
#包括
#包括
使用名称空间std;
整数跳转(整数arr[],整数n,整数开始,向量和向量)
{
if(start==n-1)//如果start是数组中的最后一个元素
返回0;
if(arr[start]==0)//如果数组元素为0
返回INT_MAX-n;
最小整数=最大整数;
整数步;
对于(int i=1;i本质上,这是最小的修复,因此示例数据可以正常工作。我没有检查所有的边缘情况。例如,如果无法到达终点,则可能需要打印int_MAX
值以外的内容
问题1
您希望输出值(即示例中的2、3、4)而不是索引(0、1、4)。因此,必须推送值而不是索引
vec1.push_back(arr[start]);
问题2
if(start == n-1) // if start is the last element in array
return 0;
当到达终点时,这不会添加最终值。您必须使用以下内容添加最后一个值:
vec.push_back(arr[start]);
问题3
if( arr[start] == 0) // if array element is 0
return 0;
未到达结尾的序列将被认为是非常好的。您应该返回一个较大的值。由于\u jump
是1+返回值jump
,因此返回值应该是INT\u MAX-1
,出于同样的原因,最小值也应该初始化为该值
或者,也可以返回其他值,如n
问题4
最后,以下条件不正确:
vec = (_jump < minimum) ? vec1 : vec2;
vec=(_jump
当条件未被验证时,需要在vec1
中复制的是vect2
,因为循环使用vect1
您能解释一下您试图解决的算法问题吗?它可能会帮助我们。同时提供完整的代码,以便我们能够执行它。最后,您得到的输出是什么nd您是否尝试过调试?在跳转中
,每次您选择不调整最小值
,您都会通过vec=vec2;
放弃累积的跳转列表。我认为这个问题需要您进行更多的调试工作,然后才能准备好。尝试简化情况。例如,当前的考试ple使用10个元素的数组。你能用9个元素来演示这个问题吗?8?你能把它缩短到多短?在缩短输入后,调试跳转
。在每个循环迭代结束时检查vec
、vec1
和vec2
的值(别忘了考虑递归)。这些值是否是基于您的算法所期望的值?您能缩小问题的范围吗?@Yonlif我已尝试解释问题。我尝试调试,发现我的vector vec大小为0。我推入vector vec,但大小仍然为0。@JaMiT我缩小了问题的范围。我尝试调试,但vector vec.size()是0。这就是为什么在输出第2行中没有显示任何内容。虽然您发现了一些问题,但代码的输出是1 4 3-1-1
。可能性。索引应该是0,1,4
,因此一个项目在开始时漏掉,一个项目在结束时漏掉了。另外,似乎应该在索引中显示值。顺便说一下步骤
并不是在所有路径上都初始化。@Phil1970没有,143-1-1
是正确的。正如我在回答中所描述的,向量中的每个值都代表我们从该值存储的索引跳转到的下一个索引。在这种情况下,我们从向量的索引0开始,它告诉我们下一个索引是1,在这里我们找到4,这是结束正如您所建议的,可能存在一些未处理的边缘场景,我将留给读者来解决。(1)查看问题中的预期输出!(2)3
在您的序列中代表什么?@Phil1970您的批评不恰当。我提出了OP存储序列的方法。我还建议OP使用此方法输出此序列需要的任何形式的完整解决方案。我理解了您提到的前3个问题。我提出了一个错误。但我无法理解最后一个。我尝试了你所说的,但输出没有改变。你能帮我理解吗?我应该执行哪些更改?循环使用vec1
,它应该是每次迭代时的原始值。因此,当条件未得到验证时(未找到最小值),vec1需要重置为其原始状态(即复制到vec2
.T中的副本)
if( arr[start] == 0) // if array element is 0
return 0;
vec = (_jump < minimum) ? vec1 : vec2;