Python练习题 043:Project Euler 015:方格路径
本题来自 Project Euler 第15题:https://projecteuler.net/problem=15
'''
Project Euler: Problem 15: Lattice paths
Starting in the top left corner of a 2×2 grid,
and only being able to move to the right and down,
there are exactly 6 routes to the bottom right corner.
How many such routes are there through a 20×20 grid? Answer: 137846528820
''' import itertools, time startTime = time.clock() # print(len(list(itertools.combinations([i for i in range(40)], 20)))) def factorial(x):
t = 1
for i in range(1, x+1):
t *= i
return t print(factorial(40)//`(factorial(20)*factorial(40-20))) print('Time used: %.2d' % (time.clock()-startTime))
原谅我智商低,这题我思考了一两天了也没想出来。参考网上 这篇文章 的分析,说是:
20*20的方格中,从左上角到右下角,不论怎么走,都只需要40步,其中必然有20步时横着走,20步时竖着走,你可以先全部先横着走,然后竖着走。所以这个问题变成了从40步中取出20步一共有多少种方法?用排列组合C(20上)(40下)。
个中算法俺真心不懂,不过求 C20/40 的组合值,不是有 itertools.combinations() 吗?我一试(也就是上面代码中被注释掉的那一行),结果电脑立马就死掉了——这得是多大的计算量啊~~~~~
后来查了下组合的计算公式:

代入数值的话,就是:

n! 表示计算阶乘(1 * 2 * 3 * ... * n),于是先定义个阶乘的函数,之后一引用计算就OK了,而且还死快!唉,看来以后还是得少用 itertools 里的方法了……
P.S.: 上述代入数值后的公式,因为分子分母都是乘来乘去的,40! = 20! * 21 * 22 * ... * 40,所以其实还可以把分子分母中的 20! 都约掉,这样还能减少点计算量。不过,对于计算机而言,这点优化几乎可以忽略不计,所以……就不折腾了~
那么,问题来了:为啥“这个问题变成了从40步中取出20步一共有多少种方法”呢?
Python练习题 043:Project Euler 015:方格路径的更多相关文章
- Python练习题 032:Project Euler 004:最大的回文积
本题来自 Project Euler 第4题:https://projecteuler.net/problem=4 # Project Euler: Problem 4: Largest palind ...
- Python练习题 029:Project Euler 001:3和5的倍数
开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...
- Python练习题 046:Project Euler 019:每月1日是星期天
本题来自 Project Euler 第19题:https://projecteuler.net/problem=19 ''' How many Sundays fell on the first o ...
- Python练习题 039:Project Euler 011:网格中4个数字的最大乘积
本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...
- Python练习题 033:Project Euler 005:最小公倍数
本题来自 Project Euler 第5题:https://projecteuler.net/problem=5 # Project Euler: Problem 5: Smallest multi ...
- Python练习题 049:Project Euler 022:姓名分值
本题来自 Project Euler 第22题:https://projecteuler.net/problem=22 ''' Project Euler: Problem 22: Names sco ...
- Python练习题 048:Project Euler 021:10000以内所有亲和数之和
本题来自 Project Euler 第21题:https://projecteuler.net/problem=21 ''' Project Euler: Problem 21: Amicable ...
- Python练习题 047:Project Euler 020:阶乘结果各数字之和
本题来自 Project Euler 第20题:https://projecteuler.net/problem=20 ''' Project Euler: Problem 20: Factorial ...
- Python练习题 045:Project Euler 017:数字英文表达的字符数累加
本题来自 Project Euler 第17题:https://projecteuler.net/problem=17 ''' Project Euler 17: Number letter coun ...
随机推荐
- JVM大作业5——指令集
JVM的每一个线程都有一个虚拟机栈,方法调用时,JVM会在虚拟机栈内为该方法创建一个栈帧. 一条线程,只有正在执行的方法对应的栈帧时可活动的,这个栈帧被称为当前栈帧,当前栈帧对应的方法被称为当前方法, ...
- xmind8 破解激活教程
这里以windows为例来演示,其它操作系统需根据情况修改相应步骤. 一.下载安装包 首先去xmind国外官网下载对应操作系统的安装包,国内官网的那个是有残缺的,不支持破解. 官网下载链接 二.下载破 ...
- vim编辑器 与etc目录
第1章 目录结构 1.1 vim vim故障 vim 是vi的升级版本 vi类似于文本文档 vim类似于notepad++ 编辑 必须先安装vim命令 yum -y insta ...
- android开发之edittext弹出输入框遮挡住文字。解决方法
在ManiFest清单文件中修改被遮挡的类的EditText android:windowSoftInputMode="adjustPan|stateHidden"
- 备份etc下的内容
echo "start backup..."sleep 3cp -av /etc/ /data/etc`date +%F`/echo "end backup"~ ...
- Python模拟保护和私有成员
保护成员:以一个下划线开头.Python不会做特殊处理 私有成员:以两个下划线开头.Python会做mangling
- I - 乓 (BFS+邻接表)
USTC campus network is a huge network. There is a bi-directional link between every pair of computer ...
- Kubernetes 初体验(先占个坑)
- Kubernetes-12:Secret介绍及演示
Secret介绍 Secret存在的意义 Secret解决了密码.token.密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中,可以以Volume或者环境变量的方式使用 ...
- db2官方文档
开局贴链接.这个东西是真坑,下载竟然需要账号... (我就做一下记录,别喷我)