【问题标题】:Segmentation fault in solving dynamic problem [closed]解决动态问题中的分段错误[关闭]
【发布时间】:2021-03-21 13:38:04
【问题描述】:

这些类型的计算ans在动态问题中有什么不同吗?因为在代码 3 的情况下,我在代码 1 和代码 2 传递时遇到分段错误

int dp[8005][2];//dp is initialized as -1 in main
int a=4;
int b=6;
int tar=90;


int solve(int pos,int ba)
{
    
    if(pos<0||pos>8000||ba>=2)
        return 1e6+1;
    
    if(pos==tar)
        return 0;

    //Code 1
    int &ans=dp[pos][ba];
    if(ans!=-1)
       return dp[pos][ba];
    ans=1+solve(pos+a,0);
    ans=min(ans,1+solve(pos-b,ba+1));
    return ans;

    //Code 2
    if(dp[pos][ba]!=-1)
       return dp[pos][ba];
      dp[pos][ba]=1+solve(pos+a,0);
        dp[pos][ba]=min(dp[pos][ba],1+solve(pos-b,ba+1));
        return dp[pos][ba]; 
    
    //Code 3
  if(dp[pos][ba]!=-1)
       return dp[pos][ba];
   int ans=1+solve(pos+a,0);
    ans=min(ans,1+solve(pos-b,ba+1));
    return dp[pos][ba]=ans;
}

【问题讨论】:

  • 我实际上已经添加了基本案例。它是如何无限递归的?

标签: c++ recursion segmentation-fault overflow dynamic-programming


【解决方案1】:

代码 3 不会更新 dp,直到 完成所有计算。

前两个去

  • 递归
  • 更新dp
  • 递归
  • 更新dp
  • 返回新值

请注意,1 和 2 是等价的,因为 ansdp[pos][ba] 相同。

第三个是

  • 递归
  • 递归
  • 更新dp并返回新值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多