0
点赞
收藏
分享

微信扫一扫

【Golang必备算法】动态规划

书坊尚 2022-01-06 阅读 61

509. 斐波那契数

方法一:递归

func fib(n int) int {

if n==0{
    return 0
}

if n==1{
    return 1
}
return fib(n-1)+fib(n-2)
}

方法二:动态规划

func fib(n int) int {
    dp:=make([]int,n+2)
    dp[0]=0
    dp[1]=1

    if n < 2{
        return dp[n]
    }

    for i:=2;i<=n;i++{
        dp[i]=dp[i-1]+dp[i-2]
    }
    return dp[n]

}

70. 爬楼梯

func climbStairs(n int) int {
    dp:=make([]int,n+2)
    dp[1]=1
    dp[2]=2

    if n<3{
        return dp[n]
    }

    for i:=3;i<=n;i++{
        dp[i]=dp[i-1]+dp[i-2]
    }

    return dp[n]
}

746. 使用最小花费爬楼梯

func minCostClimbingStairs(cost []int) int {

    //dp[i]是到达第i层最低花费
    dp:=make([]int,len(cost))
    dp[0]=cost[0]
    dp[1]=cost[1]
    
    for i:=2;i<len(cost);i++{
    dp[i]=min(dp[i-1],dp[i-2])+cost[i]
    }

    return min(dp[len(cost)-1],(dp[len(cost)-2]))
    
    
}

func min(a,b int)int{
    if a < b{
        return a
    }
    return b
}

121. 买卖股票的最佳时机

func maxProfit(prices []int) int {
    dp:=make([][]int,len(prices))
    for j:=0;j<len(prices);j++{
        dp[j]=make([]int,2)
    }
    dp[0][0]=-prices[0]
    dp[0][1]=0
    for i:=1;i<len(prices);i++{
        //dp[i][0]是第i天持有股票所得的最多现金

        dp[i][0]=max(dp[i-1][0],-prices[i])

        //dp[i][1]是第i天不持有股票所得的最多现金
        dp[i][1]=max(dp[i-1][1],prices[i]+dp[i-1][0])    

    }

    
return dp[len(prices)-1][1]
}


func max(a,b int)int{
    if a>b{
        return a
    }
    return b
}

122. 买卖股票的最佳时机 II

func maxProfit(prices []int) int {
    dp:=make([][]int,len(prices))
    for j:=0;j<len(prices);j++{
        dp[j]=make([]int,2)
    }
dp[0][0]=-prices[0]
dp[0][1]=0

for i:=1;i<len(prices);i++{
    //dp[i][0]是第i天持有股票所得的最多现金
    dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i])

    //dp[i][1]是第i天不持有股票所得的最多现金
    dp[i][1]=max(dp[i - 1][1], dp[i - 1][0] + prices[i])
}
return dp[len(prices)-1][1]

}

func max(a,b int)int{
    if a>b{
        return a
    }
    return b
}

123. 买卖股票的最佳时机 III

func maxProfit(prices []int) int {
    dp:=make([][]int,len(prices))
    for j:=0;j<len(prices);j++{
        dp[j]=make([]int,5)
    }

    // 0 无操作
    // 1 第一次买入
    // 2 第一次卖出
    // 3 第二次买入
    // 4 第二次卖出
    dp[0][0]=0
    dp[0][1]=-prices[0]
    dp[0][2]=0
    dp[0][3]=-prices[0]
    dp[0][4]=0
        for i:=1;i<len(prices);i++{
        dp[i][0]=dp[i-1][0]
        dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1])
        dp[i][2]=max(dp[i-1][1]+prices[i],dp[i-1][2])
        dp[i][3]=max(dp[i-1][2]-prices[i],dp[i-1][3])
        dp[i][4]=max(dp[i-1][3]+prices[i],dp[i-1][4])
    }

return dp[len(prices)-1][4]

}

func max(a,b int)int{
    if a>b{
        return a
    }
    return b
}
举报

相关推荐

0 条评论