日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划 - 买卖股票的最佳时机 IV

發布時間:2024/4/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划 - 买卖股票的最佳时机 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])

class Solution { public:int maxProfit(int k, vector<int>& prices) {int n = prices.size();if (n <= 1) return 0;k = min(k, n / 2);vector<vector<int>> buy(n, vector<int>(k+1, 0)), sell(n, vector<int>(k+1, 0));buy[0][0] = -prices[0];// must befor (int i = 1; i <= k; ++i) {buy[0][i] = sell[0][i] = INT_MIN / 2;}for (int i = 1; i < n; ++i) {buy[i][0] = max(buy[i-1][0], -prices[i]);for (int j = 1; j <= k; ++j) {buy[i][j] = max(buy[i-1][j], sell[i-1][j] - prices[i]);sell[i][j] = max(sell[i-1][j], buy[i-1][j-1] + prices[i]);}}return *max_element(sell[n-1].begin(), sell[n-1].end());} };

對狀態狀態轉移進行優化:
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]不過并不影響結果,所以可以使用一維數組優化。

class Solution { public:int maxProfit(int k, vector<int>& prices) {int n = prices.size();if (n <= 1) return 0;k = min(k, n / 2);vector<int> buy(k+1), sell(k+1);buy[0] = -prices[0];// must befor (int i = 1; i <= k; ++i) {buy[i] = sell[i] = INT_MIN / 2;}for (int i = 1; i < n; ++i) {buy[0] = max(buy[0], -prices[i]);for (int j = 1; j <= k; ++j) {buy[j] = max(buy[j], sell[j] - prices[i]);sell[j] = max(sell[j], buy[j-1] + prices[i]);}}return *max_element(sell.begin(), sell.end());} };

總結

以上是生活随笔為你收集整理的动态规划 - 买卖股票的最佳时机 IV的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。