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

问题描述 投票:0回答:2

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

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

我用过的想法是:

  1. 如果n等于m,则不需要按任何按钮;
  2. 如果n大于m,那么我可以达到m的唯一方法是每次减去1。因此(n-m)移动。
  3. 并且对于n <m,我递归地称为两个移动的最小值+ 1

我得到的错误是 - 运行时错误:退出代码是-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;
}
c++14 dynamic-programming
2个回答
0
投票

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

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

0xC00000FD
STATUS_STACK_OVERFLOW
A new guard page for the stack cannot be created.

最有可能的是,堆栈溢出是由于递归太深造成的:每个递归函数调用都会在堆栈上存储一些数据(寄存器,返回地址等),这些数据在大量递归之后才会发生。这就是为什么你应该尽可能避免递归。

一种解决方案可能是尝试使用迭代方法(即foror while循环)重新制定解决方案。


0
投票

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

在某些时候,你会打电话给dfs(n=1, m=6),在

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

将调用dfs(0, 6),由于n == 0而立即返回,以及dfs(2, 6)。这将调用我们现在忽略的dfs(4, 6)dfs(1, 6),它带来的是你已经进入过的状态。这是无休止的递归。

你可能想考虑避免推蓝色如果n==2除了m==1。也许,对n==1的一些特殊处理可能也会起到作用。

© www.soinside.com 2019 - 2024. All rights reserved.