作为个工科生,辞藻比较匮乏,加上好久不写文章,不知道怎么表达数学在心中的神圣地位,只好用”美丽“来形容了。


最近在刷题以及总结一些计算机的基础知识,虽然以前也做过类似的事情,但是没有记录下来,觉得欠了数学一个名分,哈哈。这里捡两个典型例子,给自己再欣赏和折服下数学的简洁、高效和美丽。


​乍一看到这题,有点懵,我第一反应是用排列组合解,就是想像除了头尾,每之间都是一个点,去这N-1个点里找K个点就会切成K+1段绳子。但是在一个组合C(n-1,k)里面,根据切割的点数和位置算出每段绳子的长度,至少要个双层循环(K=2切两刀的情况),随着切的刀数越多,循环层数会越多,这是非常大的计算量,也会造成很多重复计算,想想头就大了啊,直接放弃看题解。。题解不看不知道,一看吓一跳!神人真是太多了。。

  • 解法一:动态规划


美丽的数学_段长度代码:
class Solution:
def cuttingRope(self, n: int) -> int:
dp = [0] * (n + 1)
dp[2] = 1
for i in range(3, n + 1):
for j in range(2, i):
dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))
return dp[n]

复杂度分析
时间复杂度:O(\(n^2\))
空间复杂度:O(n)



  • 推导过程

  1. 当所有绳段长度相等时,乘积最大
  2. 就是验证下面公式,当且仅当 \(n_1\)=\(n_2\)=\(n_3\)=...=\(n_4\)时成立。原文里面有完整的推导过程,真的是优美又优雅。求导那一步让我想起了大学学高数的时光。


\[{\frac{n_1 + n_2 + n_3+...+n_a}{a}}\geq{\sqrt[a]{n_1+n_2+...+n_a}} \]



最优的绳段长度为 3


代码

class Solution:
def cuttingRope(self, n: int) -> int:
if n <= 3: return n - 1
a, b = n // 3, n % 3
if b == 0: return int(math.pow(3, a))
if b == 1: return int(math.pow(3, a - 1) * 4)
return int(math.pow(3, a) * 2)

  • 时间和空间复杂度都能下降到O(1),牛批




​ 学习https必定会知道对称加密和不对称加密算法,ssl用到的非对称加密算法RSA,之前也学习过RSA算法的原理,但是总是不求甚解。

深深的遗憾


  • 数学基础太差,欠的太多
    数学基础真的太差了,导致现在学的很吃力。 从高中的排列组合,到大学的高数、概率论和数理统计,我好像什么都没学进去。不是我不想学,而是学不进去。
    在那些时候,魂不守舍,留下个肉体如同行尸走肉,内心不知为何那么痛苦---铺天盖地的、无法排解的痛苦,却又不知跟谁诉说,除了忍受它们,我做不了任何事情。现在似乎明白了为何会有那样个过程,可是时间已经流逝这么久了呵。
  • 很喜欢数学,人生能重来吗
    高考填志愿时,除了第一专业的计算机(因为那学校没有数学专业),其他都是填的数学,最后没学成数学。至于重来,答案显而易见,不能,至少人类做不到。接下来能做的,就是只争朝夕,对于数学能补上多少算多少吧!尽人事、听天命。
  • 贫瘠的人生
    没什么天赋,也没有努过力,还想怎样呢?慢慢刷题,背题解,做总结吧,现在也能做出一点容易的题了不是吗。