动态规划

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
}