动态规划 - 买卖股票
生活随笔
收集整理的這篇文章主要介紹了
动态规划 - 买卖股票
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
動態規劃的算法本質
- 本質上就是窮舉狀態,然后在選擇中選擇最優解
- 你只要記住狀態和選擇兩個詞即可
以上面的題目為例子
窮舉框架
dp[i][k][0 or 1] 0 <= i <= n - 1, 1 <= k <= K n 為天數,大 K 為交易數的上限,0 和 1 代表是否持有股票。 此問題共 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
代碼實現
總結
以上是生活随笔為你收集整理的动态规划 - 买卖股票的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两分钟快速理解成本函数(cost fun
- 下一篇: 仿微信、微博发朋友圈,文字+图片+视频