【发布时间】:2020-04-07 16:20:42
【问题描述】:
我有一个代码“使用递归到达数组末尾的最小跳转次数”。 但我无法打印序列。(向量 vec 中没有可打印的内容)
任何帮助将不胜感激。
说明:
我想从第一个元素(即 2)到达 最小跳跃中数组的最后一个元素(即 4)。
跳跃将如何:
第一个元素是 2。这意味着我最多可以在数组中进行 2 次跳转。如果我进行第一次跳跃,那么我可以达到第二个元素(即 3),或者如果我参加 第二次跳跃然后我可以到达第三个元素(即 1)
第二个元素是 3 ,所以我最多可以跳 3 次。第 1 跳我可以达到 1 ,第 2 跳我可以达到 0 ,第 3 跳我可以 达到 4
通过这种方式,我想以最少的跳跃次数从数组的第一个元素到达最后一个元素。
所以输出会像,从第一个元素 2,我会跳到 3。然后从 3 我会跳到 4(最后一个元素)。所以 2 跳。 ( 2 - 3 - 4 )
#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 0;
vector<int> vec1 = vec;
vector<int> vec2 = vec;
int minimum = INT_MAX;
for( int i = 1 ; i <= arr[start]; i++ )
{
vec1.push_back(start);
int _jump = 1 + jump( arr, n, start+i, vec1); // considering every jump
vec = (_jump < minimum) ? vec1 : vec2;
minimum = min(minimum, _jump);
}
return minimum;
}
int main()
{
int arr[] = { 2, 3, 1, 0, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
vector<int> vec;
cout << "Number of jumps " << jump(arr, n, 0, vec) << endl;
cout<<"Sequence is "<<endl;
for( auto x : vec)
cout << x <<" ";
return 0;
}
输出
Number of jumps 2
Sequence is
预期输出
Number of jumps 2
Sequence is 2 3 4
【问题讨论】:
-
您能解释一下您要解决的算法问题吗?它可能对我们有帮助。还提供完整的代码,以便我们能够执行它。最后,您得到的输出是什么,您是否尝试过调试?
-
在
jump中,每次你选择不调整minimum,你仍然丢弃了累积的跳转列表,通过vec = vec2; -
我认为这个问题需要您进行更多的调试工作才能为 SO 做好准备。尝试简化情况。例如,当前示例使用 10 元素数组。你能用 9 个元素证明这个问题吗? 8?你能做到多短?缩短输入后,调试
jump。在每次循环迭代结束时检查vec、vec1和vec2的值(不要忘记考虑递归)。根据您的算法,这些值是您所期望的吗?你能缩小问题的范围吗? -
@Yonlif 我试图解释这个问题。我尝试调试,发现我的向量 vec 大小为 0。我推入向量 vec,但大小仍然为 0。
-
@JaMiT 我已经缩小了问题的范围。我尝试调试,但向量 vec.size() 为 0。这就是为什么在输出中第二行没有显示任何内容。
标签: c++ algorithm c++11 c++14 dynamic-programming