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等人在研究多階段決策過程的優化問題時,提出了著名的最優化原理,把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法 動態規...