动态规划
leetcode 70 爬楼梯

func climbStairs(n int) int {
if n <= 1 {
return 1
}
dp := make([]int, n+1)
dp[0] = 1
dp[1] = 1
for i := 2; i <= n; i++ {
dp[i] = dp[i - 1] + dp[i - 2]
}
return dp[n]
}

func maxSubArray(nums []int) int {
n := len(nums)
if n == 0 {
return 0
}
// 创建dp数组,dp[i]表示以nums[i]结尾的最大子数组和
dp := make([]int, n)
dp[0] = nums[0]
maxSum := dp[0]
for i := 1; i < n; i++ {
// 状态转移方程
if dp[i - 1] + nums[i] > nums[i] {
dp[i] = dp[i - 1] + nums[i]
} else {
dp[i] = nums[i]
}
// 更新全局最大和
if dp[i] > maxSum {
maxSum = dp[i]
}
}
return maxSum
}

func coinChange(coins []int, amount int) int {
dp := make([]int,amount + 1)
for i:=1;i<=amount;i++{
dp[i] = amount + 1
}
dp[0] = 0
for i := 1;i<=amount;i++ {
for _,coin := range coins {
if i>=coin {
dp[i] = min(dp[i],dp[i-coin] + 1)
}
}
}
if dp[amount] == amount + 1 {
return -1
}
return dp[amount]
}
func min(a,b int) int{
if a > b {
return b
}
return a
}