动态规划 - 买卖股票的最佳时机 IV
題目鏈接
使用兩個輔助數組
buy[i][j]buy[i][j]buy[i][j]表示前iii個股票發生jjj次交易且手上有一只股票的最大收益。
sell[i][j]sell[i][j]sell[i][j]表示前iii個股票發生jjj次交易且手上沒有股票的最大收益。
狀態轉移為:
buy[i][j]=max(buy[i?1][j],sell[i?1][j]?price[i])buy[i][j]=max\big(buy[i?1][j],sell[i?1][j]?price[i]\big)buy[i][j]=max(buy[i?1][j],sell[i?1][j]?price[i])
sell[i][j]=max(sell[i?1][j],buy[i?1][j?1]+price[i])sell[i][j]=max\big(sell[i?1][j],buy[i?1][j-1]+price[i]\big)sell[i][j]=max(sell[i?1][j],buy[i?1][j?1]+price[i])
對狀態狀態轉移進行優化:
buy[j]=max(buy[j],sell[j]?price[i])buy[j]=max\big(buy[j],sell[j]?price[i]\big)buy[j]=max(buy[j],sell[j]?price[i])
sell[j]=max(sell[j],buy[j?1]+price[i])sell[j]=max\big(sell[j],buy[j-1]+price[i]\big)sell[j]=max(sell[j],buy[j?1]+price[i])
這里存在一個問題,當更新sell[j]sell[j]sell[j]時,用到了buy[j?1]buy[j-1]buy[j?1]的值。
但是buy[j?1]buy[j-1]buy[j?1]已經更新為buy[j?1]=max(buy[j?1],sell[j?1]?price[i])buy[j-1]=max\big(buy[j-1],sell[j-1]?price[i]\big)buy[j?1]=max(buy[j?1],sell[j?1]?price[i])
那么此時的sell[j]=max(sell[j],buy[j?1]+price[i],sell[j?1])sell[j]=max\big(sell[j],buy[j-1]+price[i],sell[j-1]\big)sell[j]=max(sell[j],buy[j?1]+price[i],sell[j?1]),比正確的多了sell[j?1]sell[j-1]sell[j?1]不過并不影響結果,所以可以使用一維數組優化。
總結
以上是生活随笔為你收集整理的动态规划 - 买卖股票的最佳时机 IV的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贪心 - 分发糖果
- 下一篇: 贪心 - 按要求补齐数组