长安

关于绕开某一点p,我只能理解为,总路径中经过p的数量,乘法原理

怎么算呢,以p为出发点到终点(bi,bj),整体平移等同于起点(0,0)到(bi-pi,bj-pj)

 

1.递推

dp[i][j]=dp[i-1][j]+dp[i][j-1]

init:dp[0][j]=dp[i][0]=1

 

#38.长安
def sol(x,y):
    if(x==0 or y==0):
        return 1
    return sol(x-1,y)+sol(x,y-1)
while True:
    bi,bj,pi,pj=map(int,input().split(','))
    if(bi<0 or bj<0 or pi<0 or pj<0):
        break
    if(bi>=pi and bj>=pj):
        print(sol(bi,bj)-sol(pi,pj)*sol(bi-pi,bj-pi))
    else:
        print(sol(bi,bj))

 

2.排列组合

Ci+j取 i    或  Ci+j取 j

fact

公式: C(n,m)=n!/((n-m)!*m!)(m≤n)
外文名: combinatorial number
性质1: C(n,m)= C(n,n-m)
性质2: C(n,m)=C(n-1,m-1)+C(n-1,m)

(思考:A? 如 总共走10步,向右3步,选择1,3,6步与1,6,3步意义相同)

 

#38.长安
def fact(n):
    if(n==0):
        return 1
    return n*fact(n-1)
def cal(n,m):
    return fact(n)/(fact(n-m)*fact(m))
while True:
    bi,bj,pi,pj=map(int,input().split(','))
    if(bi<0 or bj<0 or pi<0 or pj<0):
        break
    if(pi<=bi and pj<=bj):
        print(cal(bi+bj,bi)-cal(pi+pj,pi))# 错误 应该为return c(bx, by) - c(px, py)*c(bx-px, by-py)
    else:
        print(cal(bi+bj,bi))

 

3.绕开很多点:搜索

 

posted on 2021-12-26 14:11  衔白棋子的黑猫  阅读(46)  评论(0)    收藏  举报

导航