演算法 動態規劃

2021-09-25 12:18:23 字數 3049 閱讀 4107

2.**青蛙跳台階

3.最大連續子陣列和

4.字串分割

5.路徑總數

6.路徑總數(有障礙版)

7.最小路徑和

1.1遞迴法

class

test

else

if(n==

1||n==2)

else

return

fibonacci

(n-1)+

fibonacci

(n-2);

}}

1.2動態規劃
//初始狀態:f(1)=f(2)=1

//狀態遞推:f(n)=f(n-1)+f(n-2)

//返回結果:f(n)

class

test

else

if(n==

1||n==2)

int[

] a =

newint

[n+1];

a[1]

=a[2]=

1;for(

int i =

3;i<=n;i++

)return a[n];}

}

1.3優化法
class

test

else

if(n==

1||n==2)

int f1n=1;

int f2n=1;

int result =0;

for(

int i =

3;i<=n;i++

)return result;

}}

乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多 少種跳法。

方法1:

跳n級台階,第一步有n種跳法:

跳1級,剩下n-1級,跳法為f(n-1)

跳2級,剩下n-2級,跳法為f(n-2)

…跳n級,剩下0級,跳法為f(0)

so,f(n) = f(n-1)+f(n-2)+…+f(0)

f(n-1) = f(n-2)+f(n-3)+…+f(0)

f(n) = 2*f(n-2)

-f(1) = 1

f(2) = 2

f(3) = 4

…f(n) = 2^(n-1)

方法2

除了最後一級台階必須要跳之外,其餘每級台階都有兩種可能,所以f(n) = 2^(n-1)

//方法1

class

test

}//方法2

class

test

return total;}}

//方法3

//降低時間複雜度 上述實現的時間複雜度:o(n) o(1)的實現:使用移位操作

class

test

}

子狀態:以a[i]為末尾元素的子陣列和的最大值

f(i) = max( f(i-1)+a[i] , a[i] )

f(i) = f(i-1)>0? f(i-1)+a[i] : a[i]

初始值:f(0) = a[0]

返回值:所有f(i)中的最大值

class

test

return maxsum;

}}

給定乙個字串s和乙個詞典dict,確定s是否可以根據詞典中的詞分成

乙個或多個單詞。

比如,給定

s = 「leetcode」

dict = [「leet」, 「code」]

返回true,因為"leetcode"可以被分成"leet code"

public

class

solution}}

return a[s.

length()

];}}

在乙個m*n的網格的左上角有乙個機械人,機械人在任何時候只能向下或者向右移動,

機械人試圖到達網格的右下角,有多少可能的路徑。

public

class

solution

}return a[m-1]

[n-1];

}}

機械人還是要從網格左上角到達右下角, 但是網格中新增了障礙物,障礙物用1表示。

動態規劃:

子狀態:從(0,0)到(1,0)(1,1)…(m-1,n-1)…的路徑總數

f(i,j):從(0,0)到(i,j)的路徑數

狀態遞推:

如果(i,j)=1,則總數為0,否則為f(i-1,j)+f(i,j-1)

特殊情況:第0行及第0列:1/0

public

class

solution

a[i][0

]=1;

}for

(int i =

0;i.length;i++

) a[0]

[i]=1;

}for

(int i =

1;i)else}}

return a[a.length-1]

[a[0

].length-1]

;}}

給定乙個m*n的網格,網格用非負數填充,找到一條從左上角到右下角的短路徑。 注:每次只能向下或者向右移動。

public

class

solution

for(

int i=

1;i.length;i++

)for

(int i=

1;ireturn a[a.length-1]

[a[0

].length-1]

;}}

演算法 動態規劃

動態規劃 把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解 演算法例子 1.鋼條切割 serling 公司購買長鋼條,將其切割為短鋼條,切割工序假設沒有成本支出,公司管理層希望確定最佳的切割方案。假設serling公司 一段長度為i英吋的鋼條的 為pi。鋼條的長度為整英吋,下表給出...

演算法 動態規劃

1 問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質。比如說在揹包問題中,最高總價值 max 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...

演算法 動態規劃

動態規劃的定義 動態規劃是運籌學的乙個分支,是求解決策過程的最優化的數學方法。20世紀50年代初美國數學家r.e.bellman等人在研究多階段決策過程的優化問題時,提出了著名的最優化原理,把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法 動態規...