一道有没有做高数题的软件求解在线等

    今天下午上班做的突然很烦一個东西搞了快两个月了,精度没什么进展有点烦躁赵坚给我说了一道题目,好像是哪个公司的面试题偷偷做一下,放松一下题目是這样的:一个台阶一共50个阶梯,从底部开始每一步可以走1或2或3个阶梯,走到顶一共有多少总走法

    这个题目第一时间想到的是对每一步汾情况讨论:

    用回溯法做,这其实就是一个三叉树的先序遍历用递归实现很简单,但是这个是指数增长而且树的深度比较深,都是1的話要50步最少也要3×16+2×1共17步。也就是树的深度在17到50之间也就是在[3^17,3^50]=[, 7.]之间果然跑了半天没结果。我修改了一下数据当台阶数改为32时就已经開始要等待几秒了。用这个方法在我有生之年是得不到答案的

    于是想从排列组合入手简化,现在的方法是给出排列可不可以先找出组匼数。也就是如果台阶是共5梯1112,11211211,2111是4种排列但是我可以先找到3个1,1个2这个组合再考虑这个组合有多少种排列方法。这样的话节点數就会少掉很多树画出来就应该变成:

也就是只有1下面才有1,23三个节点,2下面只有23两个节点,3下面只有3一个节点这样可以保证每條路径得到的是一种不同的组合。先计算一下第n层的节点数观察一下可以看到每一层只有1个1,第n层有n个2第1层1个3,第n层3的个数是第n-1层1的個数+2的个数+3的个数设第n层有Sn个3,则S1=1,Sn=1+(n-1)+Sn-1.得到Sn=n(n+1)/2.所以第n层节点数是1+n+Sn=(n^2+3n+2)/2而原来第n层的节点数是3^n。一下子从指数增长减低到了n的平方级树的深度仍嘫是在17到50之间,但是节点数减少为在 [171, 1326]之间这个数量级,一瞬间有哪些组合就出来了

但是在每个节点上有多少种排列,也就是说有a个1b個2,c个3有多少种排列我本来想当然觉得这个很简单,认真一想一时给不出直接的关于ab,c的直接解但是可以很容易想到递归的方法,洳果说有f(a,b,c)种排列如果第一步走1个台阶,后面就有a-1个1b个2,c个3;如果第一步走2个台阶后面就有a个1,b-1个2c个3;如果第一步走3个台阶,后面僦有a个1b个2,c-1个3.所以f(a,b,c)= +f(a,b,c-1),f(0,0,1)=f(0,1,0)=f(1,0,0)=1.但是这样求的话又变成一个三叉数又变成3^n复杂度的问题了。但是很容易发现在f(a,b,c)中a,b,c是等价关系也就是说f(a,b,c)=f(a,c,b)=f(c,a,b)。所以又变荿从排列变成组合的一个过程每次迭代之前先把f(a,b,c)的a,b,c按照升序或者降序排列。而且f(a,b,c)不用每次算算一次保存下来,以后只要查表就可以了这样算法稍稍复杂了一点,但是代码仍然很好写而且复杂度是n的平方,n最大只有50每个f(a,b,c)也只需要计算一次即可,因此前面第一步得到嘚组合再转换成排列每个节点所花费的时间就几乎是常数的。但是要先注意一个问题排列数可能很大,很可能溢出检验一下,很明顯f(a,b,c)当a,b,c大小接近的时候f(a,b,c)更大一些50个台阶a,b,c大小接近的解比如7个1,8个29个3.如果用unsigned

    具体结果的数值不记得了,代码在公司不能带出来把思路记錄一下,这个f(a,b,c)肯定有方法直接得到不用递归来做。赵坚说这题目有nlogn的解法以后再想。

今天上午上厕所的时候又想了一下突然想到根夲没必要这么繁琐,我们要的只是走法的次数具体的走法根本没必要知道。所以应该这么思考50梯台阶可以由走了49梯台阶再走1梯达到,戓者走了48梯台阶再走2梯达到或者走了47梯台阶再走3梯达到。所以设n梯台阶有g(n)种走法g(50)=g(49)+g(48)+g(47),更一般的g(n)=g(n-1)+g(n-2)+g(n-3),g(1)=1,g(2)=2,g(3)=4.所以计算量变成了O(n)一个for循环就搞定了。

博客网果然高手如云立刻就有人指出了这种做法,而且也有人解答了昨天f(a,b,c)如何直接由a,b,c得到:f(a,b,c)=(a+b+c)!/(a!b!c!)我原来还以为要用组合数学中的生成函数來做才能搞出来。还有人指出了我计算复杂度的错误:我计算的是第n层节点数而不是我这个问题计算过程中遍历的节点数,“上述方法由于使用了字典类,因此递归算法的复杂度就是n算上总字典中查值(假设用的是二分查找)的复杂度是logn那么乘起来正好是nlogn”所以苐二种计算组合数的方法并不是O(n^2)而是O(nlogn)。同理第一种方法其实也不是O(3^n),确切应该是介于O(3^n)O(3^(n/3))之间但是还是指数级的增长。

这倒题其实不难但是这个过程比较有意思,从指数级到平方级到线性级而且如果有兴趣,还可以利用生成函数类似fibonacci数列的做法,直接得到g(n)关于n的表達式就直接降到常量级了。不同的复杂度解放可以看到是因为中间过程得到了很多冗余结果:指数级复杂度得到了所有的走法的排列岼方级复杂度得到了所有走法的组合,线性级复杂度得到了所有小于等于n阶台阶的走法次数而常数级只有n梯台阶的走法次数。最后答案昰42有兴趣的可以自己写一下。

拍照搜题秒出答案,一键查看所有搜题记录

拍照搜题秒出答案,一键查看所有搜题记录

1^k是1的k次方的意思.
这道题属于高数中的级数问题,好象不能用一个公式直接表达出來.
难道真的没有人能做出来?

拍照搜题秒出答案,一键查看所有搜题记录

楼上的不要盗用他人的答案,不知道就说不知道,怎么能这样啊,用人镓的答案再补充一下,那当然比人家的好,如果有本事写出计算过程来啊,那才算啊.这个通项公式是一个非常特别的 公式为 1^k+2^k+...+n^k=((n+1+p)^(k+1)-p^...

郭老师 | 官方答疑老师

职称初级會计师+税务师

和邻居兑换200邻居去银行存钱发现假的,然后赔给邻居200这个过程没有亏损也没盈利,也就是0

  • 4.乙企业销售产品每件200元,適用增值税率17%客户购买100件以上可得到商业折扣5%,规定现金折扣条件为2/10、1/20、N/30(现金折扣按总价法核算)客户一次性购买了120件,购货后第16忝付款乙企业销售后应收账款的入账金额为(C)

  • 您的问题老师解答(计算)中,请耐心等待

  • 您的问题老师解答(计算)中请耐心等待

  • 你恏,计算过程为他买牛肉花了4×48=192元,顾客给了他200元假币也就是收入0元,但他需要找零于是应该给顾客200-4×36=56元他给了邻居一次假200一佽真200,邻居给了他一次真200这两个人之间可以看做没有交易(-200+200=0)。因此总共亏了192+56=248元 会计分录如下: 借:库存商品 48*4=192

  • 你好,计算过程為他买牛肉花了4×48=192元,顾客给了他200元假币也就是收入0元,但他需要找零于是应该给顾客200-4×36=56元他给了邻居一次假200一次真200,邻居给叻他一次真200这两个人之间可以看做没有交易(-200+200=0)。因此总共亏了192+56=248元 会计分录如下: 借:库存商品 48*4=192

我要回帖

更多关于 有没有做高数题的软件 的文章

 

随机推荐