首页 > 编程知识 正文

二分搜索的递归实现,记忆化递归

时间:2023-05-04 21:09:22 阅读:12306 作者:4886

前言前面的博客写了入门的dp算法,然后又遇到了奇怪的变种主题,同样可以用dp写(至少标签有动态规划)。 我看了答案还不能完全理解,所以又去了B站翻了教程的基础DP。 其中,记忆递归(也称为记忆搜索)相当于DP与递归优点的结合。 然后,准备写记忆化递归。

目录1.记忆化递归的解释与分析

2.记忆化递归的应用

另一方面,记忆递归的解释和分析如前所述,dp与递归的优点相结合,分别为记忆化逻辑清晰易懂

结合斐波那契数列来理解吧。

f(0)=f(1)=1;

f(n )=f ) n-1 ) f ) n-2 ) n ) 2,nN* );

现在直接给出函数代码进行说明:

intf(intn ) if ) N2 ) f ) n )=1; //其中f[]是存储数据的数组elseif(f(n )==0) /这里是重点f ) n )=f(n-1 ) f ) n-2 ); 返回f [ n ]; } 代码解释:

在第三行中,else if的条件很重要。 如果未计算f[n],则计算一次。 即如果f[n]已经被计算过储存起来了

分析优势:

相对于递归,逻辑清晰易懂是不言而喻的。

主要是相对于GDP的优势。 根据上一篇文章,我们知道dp会计算出所有的基础,并在此基础上计算出我们想要的值,从而减少了比较普通的递归重复计算。

记忆递归变得更“投机”,只计算并存储需要的值,不计算其他不用的值,使计算最大化并减少。 例如,存储递归的执行时间可能短于dp,因为dp对应于计算方阵上的所有的点,而存储递归对应于计算方阵上的有价值的点。 (请注意,这可能。 因为斐波那契数列无论是dp还是记忆递归,都会计算出前面的所有值。)

二、觉得记忆化递归的应用是写不出来的,发宝写水就写水吧。 主题是这里。

#include stdio.hint W[201],sum,d[201][20001]; intf(intk,int load ); intmax(inta,int b ); intmain(void ) {int n; scanf('%d ',n ); for(intI=1; i=n; I ) scanf('%d ',W[i]; sum=W[i]; }printf((%d(n )、sum/2 ) f ) n、sum/2 ); 返回0; (intf ) intk,int load ) {int ret=d[k][load]; if(ret==0) (/在此,判断是否计算了if (k==0||| load==0)返回ret; if(w[k]load ) ret=f(k-1,load ); elseret=d[k][load]=max(f(k-1,load ),) f (k-1,load-W[k] ) W[k] ) ); }返回ret; (intmax ) int b,int b ) ) intm=a; if(ab ) m=b; 返回m; }我提交的时候,执行时间和用dp写的一样。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。