动态编程问题中的错误。“运行时错误:退出代码为-1073741571”是什么意思?

时间:2019-04-17 08:10:04

标签: c++14 dynamic-programming

我需要帮助调试我的代码以解决问题-https://codeforces.com/contest/520/problem/B

我尝试使用动态编程来解决它,但是我遇到了错误。我想知道为什么我遇到了运行时错误?

我使用的想法是:

  1. 如果n等于m,则无需再按任何按钮;
  2. 如果n大于m,那么我到达m的唯一方法就是每次都减1。因此(n-m)移动。
  3. 对于n

我遇到的错误是-运行时错误:退出代码是-1073741571

我已经实现的代码。

#include<bits/stdc++.h>
using namespace std;
#define ll long long int

ll dfs(ll n, ll m){
    if(n == 0)  return INT_MAX;
    if(n == m){
        return 0;
    }
    if(n > m) {
        return abs(n-m);
    }
    return 1+min(dfs(2*n,m),dfs(n-1,m));
}

int main(){
    ll n, m;
    cin >> n >> m;
    ll ans = dfs(n ,m);
    cout << ans << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:0)

将退出代码-1073741571转换为十六进制(例如,使用http://www.free-test-online.com/binary/signed_converter.html:选择“签名”,输入数字,然后按“ Dec2Hex”),您将获得相应的Windows错误代码,即{ {1}}。

根据https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/596a1078-e883-4972-9bbc-49e60bebca55,这是:

C00000FD

最有可能的是,由于您的递归太深而导致堆栈溢出:每个递归函数调用将一些数据存储在堆栈中(寄存器,返回地址等),在进行大量递归之后,这些数据就差不多了。这就是为什么,您应该尽可能避免递归。

一种解决方案可能是尝试使用迭代方法(即0xC00000FD STATUS_STACK_OVERFLOW A new guard page for the stack cannot be created. for循环来重新制定解决方案。

答案 1 :(得分:0)

涉及导致堆栈溢出的算法问题:

有时,您将呼叫dfs(n=1, m=6),位于

 return 1+min(dfs(2*n,m),dfs(n-1,m));

将调用dfs(0, 6)dfs(2, 6),后者将由于n == 0而立即返回。这将调用dfs(4, 6)(我们暂时将其忽略)和dfs(1, 6),这将带来您已经处于的状态。这是无尽的递归。

如果n==2m==1以外,您可能要考虑避免按下蓝色。也许,n==1的一些特殊处理也可以解决问题。