【发布时间】:2020-06-21 18:25:56
【问题描述】:
我正在使用动态编程来解决一个问题,其中我将得到 n 并且需要通过使用这三个操作(-1、/2、/3)输出最小数量的操作以从 n 中获得 1。给定约束(1 我的代码给出了 segmentation fault(在求解函数中的某处),以获得更高的 n 值(例如 977775,1000000),但在较小的输入(例如 100000)下运行良好。 我已经尝试了很多,但我无法在我的代码中找到问题。还有其他方法可以在这个问题中应用动态编程。 任何帮助将不胜感激。
#include<iostream>
using namespace std;
int solve(int n,int a[])
{
if(n==1)
return 0;
if(a[n]!=-1)
return a[n];
int ans=100000;
for(int i=0;i<3;i++)
{
if(i==0)
{
a[n]=solve(n-1,a)+1;
if(a[n]<ans)
ans=a[n];
}
else if(i==1 && n%2==0)
{
a[n]=solve(n/2,a)+1;
if(a[n]<ans)
ans=a[n];
}
else if(i==2 && n%3==0)
{
a[n]=solve(n/3,a)+1;
if(a[n]<ans)
ans=a[n];
}
}
return ans;
}
int main()
{
int n;
cin>>n;
int a[n+1];
for(int i=0;i<=n;i++)
a[i]=-1;
int ans=solve(n,a);
cout<<ans<<endl;
return 0;
}
【问题讨论】:
-
int a[n+1];是一个可变长度数组,是标准 C++ 的一部分。我只知道一个支持它的编译器。您是否知道 VLA 的内存是在堆栈上分配的?那是你的问题。堆栈大小太小。使用堆内存。 -
可能是堆栈溢出。请考虑使用
std::vector<int> a(n+1);而不是int a[n+1];。 -
原因可能是递归调用函数过多导致堆栈溢出。如果是这种情况,使用
std::vector将无法解决此问题。 -
使用向量仍然会导致溢出。 @ThomasSablik 我改用了 int *a = new int[n+1] 但它仍然显示分段错误。还有什么我可以做的吗?
-
正如@MikeCAT 暗示的那样,问题可能与您的函数过于频繁地递归调用自身有关。使用
std::vector本身并不能解决这个问题。但是,如果您确实使用vector,请务必将其作为参数通过引用(使用int solve(int n, vector<int>& a)- 注意&),否则,每次调用都会复制整个向量。
标签: c++ segmentation-fault dynamic-programming