考える:
動的プログラミングは、大きな問題に対する最適解を複数の小さな問題に対する最適解に変換します (したがって、問題ごとに最適な解を考慮する必要があります)。動的プログラミングの具体的な問題解決手順は次のとおりです: (1) 各問題を定義します
。小さな質問(例えば、dp[i]はn歩の場合に取り得る最大の数)
(2)漸化式を求める(通常はdp[i]=dp[i-1]+dp[i-2) ])(3) 初期化
(最初の dp[0]、通常は 2 つの dp[0]、dp[1] があります)
(4) (2) を使用して、すべての問題に対する最適解を計算します。
(5) dp[n] は元の大きな問題に対する最適解です
トピック
これはフィボナッチ数 ([i]=[i-1]+[i-2]) に非常に似ています。
具体的な問題解決手順:
(1) それぞれの小さな問題を定義します: dp[i] は、n 個のステップがある場合に進むべき最大数です。
(2) 漸化関係を見つけます: dp[i]=dp[i-1] +dp[i-2])
(3) 初期化
dp[0]=1-----------0ステップの場合は1種類のみ
dp[1]=1-----------1ステップに1種類のみ
(4) (2) を使用して、すべての問題に対する最適解を計算します。
例: dp[2]=dp[1]+dp[0]----------2段の場合、移動方法は1+1通り(1+1、0+1)
(5) dp[n] は元の大きな問題に対する最適解です
for i=0;i<=n;i++{
dp[n]=dp[n-1]+dp[n-2]
}
dp[n]=dp[n-1]+dp[n-2]= dp[n-2]+dp[n-3] + dp[n-3]+dp[n-4]
= dp[n-3]+dp[n-4] +2( dp[n-4]+dp[n-5] ) + dp[n-5]+dp[n-6]
=dp[n-3]+3dp[n-4] + 3dp[n-5] ) +dp[n-6]
//?.?
コード
func climbStairs(n int) int {
if n <= 1 {
return 1 // 如果楼梯只有0阶或1阶,只有一种方法
}
dp := make([]int, n+1) // 创建一个数组来存储每个阶梯的方法数
dp[0] = 1 // 初始状态:0阶楼梯只有1种方法(不爬)
dp[1] = 1 // 初始状态:1阶楼梯只有1种方法(爬1步)
for i := 2; i <= n; i++ {
// 每次可以选择爬1阶或2阶,所以方法数等于前两阶之和
dp[i] = dp[i-1] + dp[i-2]
}
return dp[n] // 返回n阶楼顶的方法数
}