動態規劃 2 1

2021-10-02 11:27:33 字數 3220 閱讀 5037

public

intcrosssum

(int

nums,

int left,

int righ,

int p)

int rightsubsum = integer.min_value;

currsum =0;

for(

int i = p +

1;i++i)

return leftsubsum + rightsubsum;

}public

inthelper

(int

nums,

int left,

int right)

public

intmaxsubarray

(int

nums)

每步只能爬1或2個台階,總共多少種方法。

暴力法:把所有可能爬的階數進行組合,也就是1和2.

c li

mbst

airs

(i,n

)=(i

+1,n

)+cl

imbs

tair

s(i+

2,n)

climbstairs(i,n) = (i+1, n) + climbstairs(i+2,n)

climbs

tair

s(i,

n)=(

i+1,

n)+c

limb

stai

rs(i

+2,n

)其中i定義了當前階數,而n定義了目標階數。

public

class

solution

public

intclimb_stairs

(int i,

int n)

if(i == n)

return

climb_stairs

(i+1

, n)

+climb_stairs

(i+2

, n);}

}

記憶化遞迴

思路:把每一步的結果儲存在memo陣列之中,當函式每次被呼叫,我們就直接從memo陣列中返回結果。在memo陣列的幫助下,可以得到乙個修復的遞迴樹,其大小減小到n。

public

class

solution

public

intclimb_stairs

(int i,

int n,

int memo)

if(i == n)

if(memo[i]

>0)

memo[i]

=climb_stairs

(i +

1, n, memo)

+climb_stairs

(i +

2, n, memo)

;return memo[i];}

}

時間和空間複雜度為:o(n)

動態規劃

思路:可以被分解為一些包含最優子結構的子問題。即他的最優解可以從其子問題的最優解來有效構建。

在i階可以由以下的兩種方法得到:

1. 在第(i-1)階後向上爬一階

2. 在第(i - 2)階後向上爬2階。

public

class

solution

int[

] dp =

newint

[n +1]

; dp[1]

=1; dp[2]

=2;for

(int i =

3;i <= n; i++

)return dp[n];}

}

方法四:斐波那契數,

public

class

solution

int first =1;

int second =2;

for(

int i=

3;i<=n;i++

)return second;

}}

方法五:binets方法,兩種方式初始化陣列,第一種,將斐波那契數列的初始項修改為2和1來代替原來的1和0. 第二種,使用相同的初始化矩陣q並使用result = qn[0,0]得到最後的結果。

public

class

solution,}

;int res =

pow(q, n)

;return res[0]

[0];

}public

int[

]pow

(int

p,int n),}

;while

(n >0)

n >>=1;

//n的二進位制數向右移動一位

a =multiply

(a, a);}

return ret;

}public

int[

]multiply

(int

a,int[

] b)

}return c;

}}

二維陣列的動態規劃
class

solution

}return dp[m-1]

[n-1];

}}

空間壓縮
public

static

intuniquepaths

(int m,

int n)

int less = math.

min(m,n)

;int more = math.

max(m,n)

;int

dp =

newint

[less]

;//空間壓縮,就是利用了dp暫存上一輪的值,在這一次的賦值中迴圈利用第一行或第一列的值都是1,因為第一行的路徑只能是從左側走過來。

arrays.

fill

(dp,1)

;for

(int i=

1;ireturn dp[less-1]

;}

動態規劃21

如下所示的由正整數數字構成的三角形 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,和最大的路徑稱為最佳路徑。你的任務就是求出最佳路徑上的數字之和。注意 路徑上的每一步只能從乙個數走到下一層上和它最...

21th 動態規劃 路面修整

fj打算好好修一下農場中某條凹凸不平的土路。按奶牛們的要求,修好後的路面高度應當上公升或下降,也就是說,高度上公升與高度下降的路不能同時出現在修好的路中。整條路被分成了n段,n個整數a 1,a n 依次描述了每一段路的高度。fj希望找到乙個恰好含n個元素的不上公升或不下降序列b 1,b n,作為修過...

動態規劃 什麼是動態規劃?

先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...