长安
关于绕开某一点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.绕开很多点:搜索
浙公网安备 33010602011771号