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