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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

动态规划 - 买卖股票

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划 - 买卖股票 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動態規劃的算法本質

  • 本質上就是窮舉狀態,然后在選擇中選擇最優解
  • 你只要記住狀態選擇兩個詞即可


以上面的題目為例子

窮舉框架

dp[i][k][0 or 1] 0 <= i <= n - 1, 1 <= k <= K n 為天數,大 K 為交易數的上限,01 代表是否持有股票。 此問題共 n × K × 2 種狀態,全部窮舉就能搞定。for 0 <= i < n:for 1 <= k <= K:for s in {0, 1}:dp[i][k][s] = max(buy, sell, rest)

狀態轉移框架

  • 持有狀態的狀態轉移圖片

  • 其實后一天的股票盈利模式都是由前一天得到的,可以在前一天的基礎上來得到的

121.買賣股票的最佳時機 I


重點:在某一天選擇買入這只股票,并選擇在未來某一個不同的日子賣出該股票。是書寫狀態轉移方程的關鍵!

代碼實現

class Solution {public int maxProfit(int[] prices){// 對于狀態轉移來講,最關鍵是搞出狀態轉移方程int n = prices.length;// 創建dp數組用于存儲狀態轉移方程int[][] dp = new int[n][2];// 循環進行狀態轉移變換for(int i = 0; i < n; i++){if(i - 1 == -1){// 基本的狀態轉移方程dp[i][0] = 0; // 剛開始表示沒有持有股票,dp[i][1] = -prices[i]; // 為1的時候肯定是持有股票,還沒有將股票賣出// 為了提高效率,肯定是需要在進行本輪賦值結束以后,使用continue終止本輪 i - 1 == -1 的操作continue;}// 并不是在if條件的反面才進行狀態轉移方程的書寫dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]); // 前一天沒有 以及 前一天擁有并賣出進行比較dp[i][1] = Math.max(dp[i-1][1], -prices[i]); // dp[i-1][0] 因為沒有持有肯定為0}// 要想凈值最大,肯定是看在最后一天,且股票已經賣出狀態下的值return dp[n-1][0];} }

122 買賣股票的最佳時機 II


***重點:***任何時候最多只能持有一股股票,同一天可以進行購買并出售

代碼實現

class Solution {public int maxProfit(int[] prices) {// 可以使用動態規劃,狀態轉移方程來進行書寫int n = prices.length;int[][] dp = new int[n][2];for(int i = 0; i < n; i++){if(i - 1 == -1){dp[i][0] = 0;dp[i][1] = -prices[i]; // 1表示現在已經買了continue;}dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]); // 當天的股票和前一天的兩種情況進行相應比較即可dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] - prices[i]); // dp[i-1][0] - prices[i]前一天沒有股票,后一天有股票,表示已經買了股票了}return dp[n-1][0];} }

123.買賣股票的最佳時機 III


代碼實現

class Solution {public int maxProfit(int[] prices) {// 理解題目的意思,這里的k的定義并不是(已進行的交易次數),而是最大交易次數的上線限制// 如果確定今天進行一次交易,要保證截止今天最大交易次數上限為k,那么昨天的最大交易次數上線為 k-1int max_k = 2;int n = prices.length;int[][][] dp = new int[n][max_k + 1][2];// 內容都是一樣的for(int i = 0; i < n; i++){for(int k = max_k; k > 0; k--){// baseif(i - 1 == -1){dp[i][k][0] = 0;dp[i][k][1] = -prices[i]; // 第一天擁有的話,肯定是將股票進行買入了continue;}// 進行狀態轉移方程更新dp[i][k][0] = Math.max(dp[i-1][k][0], dp[i-1][k][1] + prices[i]); // 前一天有k次,但是都已經賣出去了dp[i][k][1] = Math.max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i]); // 前一天沒有,經過購買股票,使得后一天就有了}}return dp[n-1][max_k][0]; // 通過循環來進行比較也清楚最后肯定是在n-1處} }

總結

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

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