2021-02-04:第一年農場有1只成熟的母牛A,往后的每年:①每一只成熟的母牛都會生一只母牛 ②每一只新出生的母牛都在出生的第三年成熟 ③每一只母牛永遠不會死 ,請問N年后牛的數量是多少 ?
福哥答案2021-02-04:
舉例:
N=6,第1年1頭成熟母牛記為a;
第2年a生了新的小母牛,記為b,總牛數為2;
第3年a生了新的小母牛,記為c,總數為3;
第4年a生了新牛d,總數4;
第5年b成熟了,ab分別生了一只,總數為6;
第6年c也成熟了,abc分別生了一只,總數為9,故回傳9.
遞推式是f(n)=f(n-1)+f(n-3),
如果某個遞回,除了初始項之外,具有如下的形式:
F(N) = C1 * F(N) + C2 * F(N-1) + … + Ck * F(N-k) ( C1…Ck 和k都是常數),
并且這個遞回的運算式是嚴格的、不隨條件轉移的,那么都存在類似斐波那契數列的優化,時間復雜度都能優化成O(logN),
代碼用golang撰寫,代碼如下:
package main
import "fmt"
func main() {
fmt.Println(c3(6))
}
func c3(n int) int {
if n < 1 {
return 0
}
if n == 1 || n == 2 || n == 3 {
return n
}
base := [][]int{
{1, 1, 0},
{0, 0, 1},
{1, 0, 0}}
res := matrixPower(base, n-3)
return 3*res[0][0] + 2*res[1][0] + res[2][0]
}
//矩陣的p次方
func matrixPower(m [][]int, p int) [][]int {
mLen := len(m)
m0Len := len(m[0])
res := make([][]int, mLen)
for i := 0; i < mLen; i++ {
res[i] = make([]int, m0Len)
}
for i := 0; i < mLen; i++ {
res[i][i] = 1
}
tmp := m
for ; p != 0; p >>= 1 {
if p&1 != 0 {
res = muliMatrix(res, tmp)
}
tmp = muliMatrix(tmp, tmp)
}
return res
}
//兩個矩陣相乘
func muliMatrix(m1 [][]int, m2 [][]int) [][]int {
m1Len := len(m1)
m20Len := len(m2[0])
m2Len := len(m2)
res := make([][]int, m1Len)
for i := 0; i < m1Len; i++ {
res[i] = make([]int, m20Len)
}
for i := 0; i < m1Len; i++ {
for j := 0; j < m20Len; j++ {
for k := 0; k < m2Len; k++ {
res[i][j] += m1[i][k] * m2[k][j]
}
}
}
return res
}
執行結果如下:

答案參考左神的java代碼
評論
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/256853.html
標籤:區塊鏈
上一篇:2021-02-04
下一篇:支付接入常規問題
