Python 2.7 笔迹学。如何处理这类问题?我想知道解决这个问题的逻辑和思考方式。

Python 2.7 笔迹学。如何处理这类问题?我想知道解决这个问题的逻辑和思考方式。,python-2.7,dynamic-programming,graph-algorithm,Python 2.7,Dynamic Programming,Graph Algorithm,求笛卡尔平面上从(0,0)到(n,n)的路径数,该路径从不高于y=x线。可以沿路径进行三种类型的移动: move up, i.e. from (i, j) to (i, j + 1); move to the right, i.e. from (i, j) to (i + 1, j); the right-up move, i.e. from (i, j) to (i + 1, j + 1) 路径计数101 首先,我们解决一个更简单的问题: 用以下公式求笛卡尔平面上从(0,0)到(n,n)的路

求笛卡尔平面上从(0,0)到(n,n)的路径数,该路径从不高于y=x线。可以沿路径进行三种类型的移动:

move up, i.e. from (i, j) to (i, j + 1);
move to the right, i.e. from (i, j) to (i + 1, j);
the right-up move, i.e. from (i, j) to (i + 1, j + 1)
路径计数101 首先,我们解决一个更简单的问题:

用以下公式求笛卡尔平面上从(0,0)到(n,n)的路径数:

  • 向上移动,即从(i,j)移动到(i,j+1)
  • 向右移动,即从(i,j)移动到(i+1,j)
我们可以进入x 如何解决?太难了?好的,我们首先尝试找到从(0,0)到(2,2)的路径数。我们可以在网格中绘制所有路径:

我们定义

f(x,y) => the number of paths from (0, 0) to (x, y)
您可以从(1,2)或(1,2)中看到(2,2)的路径,因此我们可以得到:

f(2, 2) = f(2, 1) + f(1, 2)
然后你们会注意到点(x,y),它从(x,y-1)或(x-1,y)开始的路径。这很自然,因为我们只有两种可能的行动:

  • 向上移动,即从(i,j)移动到(i,j+1)
  • 向右移动,即从(i,j)移动到(i+1,j)
我为您画了一个更大的例子,您可以检查我们的结论:

所以我们可以得到:

f(x, y) = f(x, y - 1) + f(x - 1, y)
等等。。。如果x=0或y=0怎么办?这很直接:

if x = 0 => f(x, y) = f(x, y - 1)
if y = 0 => f(x, y) = f(x - 1, y)
最后。。。那么f(0,0)呢?我们定义:

f(0, 0) = 1
因为从(0,0)到(1,0)和(0,1)只有一条路径

好,总结一下:

f(x, y) = f(x, y - 1) + f(x - 1, y)
if x = 0 => f(x, y) = f(x, y - 1)
if y = 0 => f(x, y) = f(x - 1, y)
f(0, 0) = 1
通过递归,我们可以解决这个问题


你的问题 现在让我们讨论一下你的原始问题,只需稍微修改一下我们的方程:

f(x, y) = f(x, y - 1) + f(x - 1, y) + f(x - 1, y - 1)
if x = 0 => f(x, y) = f(x, y - 1)
if y = 0 => f(x, y) = f(x - 1, y)
if x < y => f(x, y) = 0
f(0, 0) = 1
f(x,y)=f(x,y-1)+f(x-1,y)+f(x-1,y-1)
如果x=0=>f(x,y)=f(x,y-1)
如果y=0=>f(x,y)=f(x-1,y)
如果xf(x,y)=0
f(0,0)=1
它将生成我的代码

我添加到代码中的最后一件事是。简而言之,记忆可以消除重复计算——如果我们已经计算了f(x,y),只需将其存储在字典中,再也不计算它。您可以阅读wiki页面以进一步了解

这就是我的全部代码。如果您还有一些问题,可以在这里留言,我会尽快回复

代码:

d={}#记忆化
def查找(x,y):
如果x==0且y==0:
返回1
如果x0:
ret+=find(x-1,y)
如果y>0:
ret+=find(x,y-1)
如果x>0且y>0:
ret+=find(x-1,y-1)
d[(x,y)]=ret
回程网
打印查找(2,1)#4

对于解决这类问题的其他想法,有一种数学好奇心,它不仅与晶格行走产生的序列一一对应,其中一个人的步数必须保持在x=y线以下,而且与真正的过多一致,在解决问题和研究方面具有广泛适用性的数学怪兽

这些奇怪之处是什么? :

C_n=1/(n+1)*(2n)选择(n),n>=0,其中如果n=0,C_0=1

它们还包括:

  • 包含$n$对括号的表达式数
    • 例n=3:(()),(()),(()),(()),(()),(()),(()),(())
  • 具有n+1个顶点的平面树数
  • 凸(n+2)-gon的三角剖分数
  • 乘积的单项式:p(x1,…,xn)=x1(x1+x2)(x1+x2+x3)。。。(x1+…+xn)
  • 有根平面树的二部顶点
  • 还有更多的事情
  • 这些对象出现在数学物理的许多活跃研究中,例如,由于数据集庞大,这是算法研究的一个活跃领域


    所以,你永远不会知道,在某个黑暗的数学深处,什么看似遥远的概念紧密地联系在一起

    抱歉,这不是为你做作业的网站。我知道你有一个特别的问题,我们会尽力帮你解决,但如果你没有试图解决它,甚至没有真正的问题,就放弃你的家庭作业是不可取的。@bicker,这不是我的家庭作业问题。我无法处理此类问题。所以我想知道的是如何开始解决这些问题。我不想要答案。我想知道方法检查@Ante它不是加泰罗尼亚数字,因为它有
    (x,y)=>(x+1,y+1)
    @说它不是加泰罗尼亚数字,但加泰罗尼亚数字可以用来找到解决方案。选择对角线移动的位置将给出路径数作为和(二项式(n,i)*catalan(i),对于{0,…,n}中的i)。WolfranAlpha给出了这个。可以通过更改2F1中的第二个参数来计算。对于路径数为223191的州,你能教我如何处理这类问题,特别是在解决这类问题时如何思考吗。我不要密码。我想知道你的方法。@amruthvenkat好的。。。现在我正在工作,我会在几个小时后详细解释我的解决方案…@amruthvenkat,这样你就可以投票支持我的答案。如果对我的答案没有更多问题,你可以将我的答案设置为已接受。我已对你的答案进行了投票,但由于我的声誉不是15岁,所以不会在这里显示…@amruthvenkat好的。。。当你拥有至少15个声誉时,请不要忘记为我投票……:)
    d = {}  # Memoization
    
    
    def find(x, y):
        if x == 0 and y == 0:
            return 1
        if x < y:
            return 0
        if d.get((x, y)) is not None:
            return d.get((x, y))
        ret = 0
        if x > 0:
            ret += find(x - 1, y)
        if y > 0:
            ret += find(x, y - 1)
        if x > 0 and y > 0:
            ret += find(x - 1, y - 1)
        d[(x, y)] = ret
        return ret
    
    
    print find(2, 1) # 4