Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用递归到达序列末尾的最小跳转次数_C++_Algorithm_C++11_C++14_Dynamic Programming - Fatal编程技术网

C++ 使用递归到达序列末尾的最小跳转次数

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

我有一个“使用递归到达数组末尾的最小跳跃次数”的代码但我无法打印序列。(vector vec中没有要打印的内容)
任何帮助都将不胜感激

说明:
我想从第一个元素(即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;