【发布时间】: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