求横、竖、对角方向上连续四个数乘积的最大值。
暴力解,没什么技术含量。
简单的动态规划。同样的题还有Problem 67。
先排序,再算score。
找循环节。本来是我最得意的一题,看了别人的解答以后,狂汗!
由于是模d,所以1/d 的循环节最多不超过d 位(鸽笼原理)。
看高手是怎么做的!
稍稍解释一下/1 的意思,这是一个回溯引用,引用前面划分出来的那个子表达式(/w+?)。/1 表示引用模式里的第一个子表达式,/2 代表第二个,/3 代表第三个 ……。
算不同的幂的个数。
见这里。
先写了一个ugly 版本:
后来实在看不下去了,写了一个递归版本,但不知道怎么把结果累加起来,只好用了全局变量-_-!!
这个程序的最大问题就是你必须先蒙一个范围,比如2000。
一个叫dfg59 的哥们这样写道:
记得mathn 库有个叫prime_division() 的函数,可以把自然是分解成素因子的幂的积的形式(当然,是用数组表示的)。
会不会太简单了!自己写一个prime_division():
嗯,速度还行,花了31.75秒。
看后面的论坛,看到了一位老兄四行搞定:
为什么又是3330呢?巧合??
第50题想了好久,一开始随手写了一个遍历所有可能的算法,跑了一晚也没算出来。后来重读了一遍题目,一想,既然是找最大的,何不从最长的区间开始搜呢。结果只花了不到4秒就算出来了,997651。算法的威力啊!!!
筛法是抄Bob大叔的。
固定区间长度,先找到最靠右、其和又没超过1,000,000的区间,不断左移。只要找到,它一定是最长最大的。
和Problem 18 一个味。