來自數學的降維打擊

2021-10-09 08:53:57 字數 934 閱讀 5645

給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, …)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。

任何正整數都可以拆分成不超過4個數的平方和 —> 答案只可能是1,2,3,4

若乙個數最少可以拆成4個數的平方和,則這個數還滿足 n = (4^a)*(8b+7) —> 因此可以先看這個數是否滿足上述公式,如果不滿足,答案就是1,2,3了

若這個數本來就是某個數的平方,那麼答案就是1,否則答案就只剩2,3了

如果答案是2,即n=a2+b2,那麼我們可以列舉a,來驗證,如果驗證通過則答案是2,否則只能是3

因此降維打擊的**可寫成這樣

// n=4^a(8b+7) 四平方定理

func

numsquares

(n int

)int

if n %8==

7 a:=

0for a*a <= n

else

} a +=1}

return

3}

計算遞迴層深度,上下層深度比較,最小為最佳,以減次大平方數為條件,餘數作次級

import

"math"

func

numsquares

(n int

)int

// 內層裁剪,減少來自回溯期的無效計算

if step >= minstep-

1// 倒序確保計算量最少

sqrt :=

int(math.

sqrt

(float64

(remain)))

for i:=sqrt;i>=

1;i--

}dfs(0

,n)return minstep

}

微積分的思維 降維打擊

寫在前面 眾所周知,在我們的意識體系裡,比較兩個變數的前提是 單位相同,把兩個單位不同的量作比較是沒有意義的一件事情,比如乙個人體重100kg,另乙個人身高180cm,我們是沒法用這兩個數量作比較的。但是在微積分的思維裡,經過適當的轉化,這種跨單位的量的比較,將會變得有意義。在工程設計中,普遍地會用...

狀態壓縮技巧 動態規劃的降維打擊

本文由labuladong原創,本博文僅作為知識點學習,不會用於任何商業用途!動態規劃技巧對於演算法效率的提公升非常可觀,一般來說都能把指數級和階乘級時間複雜度的演算法優化成 o n 2 堪稱演算法界的二向箔,把各路魑魅魍魎統統打成二次元。但是,動態規劃本身也是可以進行階段性優化的,比如說我們常聽說...

賺錢套路分享 降維打擊,報團取暖的玩法

loonggg 讀完需要 3分鐘 速讀僅需1分鐘 說了,接下來的一段時間,我會陸陸續續分享一些,我所知道的關於很多程式設計師賺錢套路的 所見所聞 今天,我過來給大家講故事了。這個故事的主人也是乙個程式設計師。應該是四五年前的事,看到這個人的玩法的時候,感覺挺有意思,當時那個人搞得名字還挺響亮,叫 降...