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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

算法:买卖股票最佳时机(c++)

發布時間:2023/12/20 c/c++ 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法:买卖股票最佳时机(c++) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

買賣股票相關問題:

1,只能買賣一次:

假設有一個數組,它的第i個元素是一支給定的股票在第i天的價格。 如果你最多只允許完成一次交易,設計一個算法來找出最大利潤。例如:[3,4,5,1,9] 輸出:8 解釋:第四天買入,第五天賣出

原理:為了減少復雜度,這里用峰谷的方法遍歷
在第一個不虧損的日子買入,然后比較,如果后一天不賣是虧損還是接著賺。
虧損就放棄這一段,從下一個日子開始繼續分析
接著賺就不放棄。
【說實話我覺著難點在怎么記這個開始和結束的日子,我還試了一下,挺麻煩的】
c++實現代碼如下:

int main() {int array[5] = {1,2,5,4,3};int max = 0;int num =0;for (int i = 0; i < sizeof(array)/sizeof(array[0]) - 1; i++){num = num + (array[i + 1] - array[i]);if (num < 0){num = 0;continue;}if (max < num){max = num;}}if (max == 0){printf("別買了吧就\n");}else{printf("能賺%d塊錢",max);} }

2,可以無限次買賣
【其實這個在第三個,但我覺著它比第三個簡單點……甚至比第一個簡單】

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 你可以盡可能地完成更多的交易(多次買賣一支股票)。 注意:你不能同時參與多筆交易例; 輸入:【1,2,3,5,2】 輸入:4

原理非常簡單:比較相鄰兩次的值,能賺就買,會虧就不買
代碼如下:

int main() {int array[5] = {1,2,5,4,3};int max = 0;int num =0;for (int i = 0; i < sizeof(array)/sizeof(array[0]) - 1; i++){if (array[i + 1] > array[i]){max += array[i + 1] - array[i];}}if (max == 0){printf("別買了吧就\n");}else{printf("能賺%d塊錢",max);} }

3,只限兩次買賣:

給定一個數組,它的第 i 個元素是一支給定的股票在第 i 天的價格。設計一個算法來計算你所能獲取的最大利潤。你最多可以完成 兩筆 交易。注意: 你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。示例 1:輸入: [3,3,5,0,0,3,1,4] 輸出: 6 解釋: 在第 4 天(股票價格 = 0)的時候買入,在第 6 天(股票價格 = 3)的時候賣出,這筆交易所能獲得利潤 = 3-0 = 3 。 隨后,在第 7 天(股票價格 = 1)的時候買入,在第 8 天 (股票價格 = 4)的時候賣出,這筆交易所能獲得利潤 = 4-1 = 3 。

這部分借鑒的這篇文章:https://blog.csdn.net/lzz_zz/article/details/102860884
看這段的時候滿腦子,媽媽這段代碼好牛逼……
嗯……把大佬的思路展開一下!
【為了做這題我還去撿了一下動態規劃】
簡單的說,其實可以把兩次買賣規劃成這樣:
第一天:買/賣/維持
第二天:買/賣/維持
……
每個結點有自己的值(股票價格)
其實就是一個四層的樹
不過也有特別的地方,比如如果第一天沒買,第二天就不可能賣,不過這點我們后說。
把每個結點動態規劃出來:
【前面是不操作,后面是操作】
s1[i] = max(s1[i-1],-price)
s2[i] = max(s2[i-1],s1[i-1]+price)
s3[i] = max(s3[i-1],s2[i-1]-price)
s4[i] = max(s4[i-1],s3[i-1]+price)
動態規劃是一種自底向上的結構——但是這里的循環排序是s4,s3,s2,s1這樣的,為什么呢?
因為,開始時設定的s1為負無窮,s3為負無窮,這樣在位置為1的時候前三者都處于極限狀態,只有s1能夠獲得實際數值——而s1能影響下個位置的s2,事實上,這還是從s1往上討論的。
而s2的判斷方式和第一問,一次買賣的想法類似。
實現代碼如下:

#include <iostream> #include <stdlib.h> int max(int a, int b) {if (a > b)return a;elsereturn b; } int main() {int array[6] = {3,2,5,4,3,6};int s1 = INT8_MIN, s2 = 0, s3 = INT8_MIN, s4 = 0;for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++){s4 = max(s4,s3+array[i]);s3 = max(s3, s2 - array[i]);s2 = max(s2, s1 + array[i]);s1 = max(s1, -array[i]);}printf("%d",s4);return 0; }

總結

以上是生活随笔為你收集整理的算法:买卖股票最佳时机(c++)的全部內容,希望文章能夠幫你解決所遇到的問題。

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