188. 买卖股票的最佳时机 IV-day2

文章介绍了如何利用动态规划思想解决股票交易问题,通过定义buy和sell两个一维数组来记录k次交易中的最大利润,通过嵌套循环遍历股票价格,更新buy和sell数组,最后返回sell数组的第k个元素作为结果。
摘要由CSDN通过智能技术生成

题目描述如上,可以顺着前几题动态规划的思想来做,弄清这里与前几题的区别:

1.这里可以交易k次,买卖股票(三)是两次。

2.不需要像三一样去写多种状态转移方程。

既然可以交易k次,那可以定义两个一维数组,一组为buy,另外一组为sell,只是在遍历的时候要弄清楚次序问题,这里首先要顺着数组顺序(股票每天的价格)遍历,然后内嵌循环是k次交易的遍历。

vector<int> buy(k,-prices[0]);

vector<int> sell(k,0); //定义两个数组,将buy初始化为购入第一天股票所剩利润,sell初始化为0;

for(int i=0;i<prices.size();i++){ //按照数组顺序遍历

    buy[0]=max(buy[0],-prices[i]); 

    sell[0]=max(sell[0],buy[0]+prices[i]);//对于每一天不同的价格重新定义第一次购入卖出

    for(int j=1;j<k;j++){ //k次购入卖出

        buy[j]=max(buy[j],sell[j-1]-prices[i]);

        sell[j]=max(sell[j],buy[j]+prices[i]);  //注意这里j从1开始定义,而prices要与i相关,即每一天价格;

    }

}

//最终输出与之前一致,输出最后一个sell即可

return sell[k-1];

完整代码如下:

#include <iostream>
#include <vector>
using namespace std;

class Solution {

public:

    int maxProfit(int k, vector<int>& prices) {

vector<int> buy(k,-prices[0]);

vector<int> sell(k,0);

for(int i=0;i<prices.size();i++){

    buy[0]=max(buy[0],-prices[i]);

    sell[0]=max(sell[0],buy[0]+prices[i]);

    for(int j=1;j<k;j++){

        buy[j]=max(buy[j],sell[j-1]-prices[i]);

        sell[j]=max(sell[j],buy[j]+prices[i]);

    }

}

return sell[k-1];

    }

};

int main(){

    Solution solution;

    vector<int> prices={2,8,6,4,6,56,56,9,4,641,2,158};

    int max_profit=solution.maxProfit(3,prices);

    cout<< max_profit <<endl

    return 0;

    }

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值