• DP31 买卖股票的最好时机(二)、(三)、(四)


    买卖股票的最好时机(二)

    描述

    假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

    1. 你可以多次买卖该只股票,但是再次购买前必须卖出之前的股票

    2. 如果不能获取收益,请返回0

    3. 假设买入卖出均无手续费

    要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

    进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

    输入描述:

    第一行输入一个正整数 n ,表示数组 prices 的长度

    第二行输入 n 个正整数,表示数组中prices的值

    输出描述:

    输出最大收益

    示例1

    输入:

    7
    8 9 2 5 4 7 1

    复制输出:

    7

    复制说明:

    在第1天(股票价格=8)买入,第2天(股票价格=9)卖出,获利9-8=1
    在第3天(股票价格=2)买入,第4天(股票价格=5)卖出,获利5-2=3
    在第5天(股票价格=4)买入,第6天(股票价格=7)卖出,获利7-4=3
    总获利1+3+3=7,返回7     
     

    示例2

    输入:

    5
    5 4 3 2 1

    复制输出:

    0

    复制说明:

    由于每天股票都在跌,因此不进行任何交易最优。最大收益为0。          

    示例3

    输入:

    5
    1 2 3 4 5

    复制输出:

    4

    复制说明:

    第一天买进,最后一天卖出最优。中间的当天买进当天卖出不影响最终结果。最大收益为4。      
    1. #include<stdio.h>
    2. #include<algorithm>
    3. using namespace std;
    4. int prices[100005];
    5. int dp[100005][3];
    6. int main()
    7. {
    8. int n;
    9. scanf("%d",&n);
    10. for(int i=1;i<=n;i++)
    11. {
    12. scanf("%d",&prices[i]);
    13. }
    14. int ans=0;
    15. int pre=prices[1];
    16. for(int i=2;i<=n;i++)
    17. {
    18. int current=prices[i];
    19. if(current>pre)
    20. {
    21. ans+=current-pre;
    22. }
    23. pre=current;
    24. }
    25. printf("%d\n",ans);
    26. return 0;
    27. }

    DP32 买卖股票的最好时机(三)

    描述

    假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
    1. 你最多可以对该股票有两笔交易操作,一笔交易代表着一次买入与一次卖出,但是再次购买前必须卖出之前的股票
    2. 如果不能获取收益,请返回0
    3. 假设买入卖出均无手续费

    要求: 空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

    进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

    输入描述:

    第一行输入一个正整数 n ,表示数组 prices 的长度

    第一行输入 n 个正整数,表示数组 prices 的所有元素的值 

    输出描述:

    输出最大收益

    示例1

    输入:

    6
    8 9 3 5 1 3

    复制输出:

    4

    复制说明:

    第三天(股票价格=3)买进,第四天(股票价格=5)卖出,收益为2
    第五天(股票价格=1)买进,第六天(股票价格=3)卖出,收益为2
    总收益为4。             
     

    示例2

    输入:

    4
    9 8 4 1

    复制输出:

    0

    复制

    示例3

    输入:

    5
    1 2 8 3 8

    复制输出:

    12

    复制说明:

    第一笔股票交易在第一天买进,第三天卖出;第二笔股票交易在第四天买进,第五天卖出;总收益为12。
    因最多只可以同时持有一只股票,所以不能在第一天进行第一笔股票交易的买进操作,又在第二天进行第二笔股票交易的买进操作(此时第一笔股票交易还没卖出),最后两笔股票交易同时在第三天卖出,也即以上操作不满足题目要求。    
    
    
    1. #include<stdio.h>
    2. #include<algorithm>
    3. #include<string.h>
    4. using namespace std;
    5. int prices[100005];
    6. int dp[100005][5];
    7. int main()
    8. {
    9. int n;
    10. scanf("%d",&n);
    11. for(int i=1;i<=n;i++)
    12. {
    13. scanf("%d",&prices[i]);
    14. }
    15. //dp[i][0]表示到第i天为止没有买卖过股票的最大收益
    16. //dp[i][1]表示到第i天为止买过一次股票还没有卖出的最大收益
    17. //dp[i][2]表示到第i为止买卖过一次股票的最大收益
    18. //dp[i][3]表示到第i天为止买了两次卖出一只的最大收益
    19. //dp[i][4]表示到第i天为止买卖了两次股票的最大收益
    20. for(int i=0;i<=4;i++)
    21. {
    22. dp[1][i]=-1e9;
    23. }
    24. dp[1][0]=0;
    25. dp[1][1]=-prices[1];
    26. for(int i=2;i<=n;i++)
    27. {
    28. dp[i][0]=dp[i-1][0];
    29. dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
    30. dp[i][2]=max(dp[i-1][2],dp[i-1][1]+prices[i]);
    31. dp[i][3]=max(dp[i-1][3],dp[i-1][2]-prices[i]);
    32. dp[i][4]=max(dp[i-1][4],dp[i-1][3]+prices[i]);
    33. }
    34. int ans=max(dp[n][0],max(dp[n][2],dp[n][4]));
    35. printf("%d\n",ans);
    36. return 0;
    37. }

     DP33 买卖股票的最好时机(四)

    描述

    假设你有一个数组pricesprices,长度为nn,其中prices[i]prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
    1. 你最多可以对该股票有kk笔交易操作,一笔交易代表着一次买入与一次卖出,但是再次购买前必须卖出之前的股票
    2. 如果不能获取收益,请返回0
    3. 假设买入卖出均无手续费

    输入描述:

    第一行输入一个正整数 n 和一个正整数 k。表示数组 prices 的长度和 交易笔数

    第二行输入 n 个正整数表示数组的所有元素值。

    输出描述:

    输出最大收益

    示例1

    输入:

    6 3
    8 9 3 5 1 3

    复制输出:

    5

    复制说明:

    第一天(股票价格=8)买进,

    第二天(股票价格=9)卖出,收益为1

    第三天(股票价格=3)买进,

    第四天(股票价格=5)卖出,收益为2

    第五天(股票价格=1)买进,

    第六天(股票价格=3)卖出,收益为2

    总收益为5。

    示例2

    输入:

    8 2
    3 2 5 0 0 3 1 4

    复制输出:

    7

    复制说明:

     
    

    第二天(股票价格=2)买进,

    第三天(股票价格=5)卖出,收益为3

    第五天(股票价格=0)买进,

    第八天(股票价格=4)卖出,收益为4

    总收益为7

    示例3

    输入:

    4 4
    9 8 4 1

    复制输出:

    0

    复制

    1. #include<stdio.h>
    2. #include<algorithm>
    3. #include<string.h>
    4. using namespace std;
    5. int dp[1005][205];
    6. int prices[1005];
    7. int main()
    8. {
    9. int n;
    10. int k;
    11. scanf("%d%d",&n,&k);
    12. for(int i=1;i<=n;i++)
    13. {
    14. scanf("%d",&prices[i]);
    15. }
    16. int s=2*k;
    17. for(int i=0;i<=s;i++)
    18. {
    19. dp[1][i]=-1e9;
    20. }
    21. dp[1][0]=0;
    22. dp[1][1]=-prices[1];
    23. for(int i=2;i<=n;i++)
    24. {
    25. for(int j=0;j<=s;j++)
    26. {
    27. if(j==0)
    28. {
    29. dp[i][j]=dp[i-1][j];
    30. }
    31. else if(j%2==1)
    32. {
    33. dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]-prices[i]);
    34. }
    35. else{
    36. dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+prices[i]);
    37. }
    38. }
    39. }
    40. int ans=0;
    41. for(int i=0;i<=s;i=i+2)
    42. {
    43. ans=max(ans,dp[n][i]);
    44. }
    45. printf("%d\n",ans);
    46. return 0;
    47. }

  • 相关阅读:
    HarmonyOS 音频开发指导:使用 OpenSL ES 开发音频播放功能
    故障诊断实验台 | PT500mini轴承齿轮箱转子故障实验台
    SyntaxError: invalid character ‘:‘ (U+FF1A)问题解决
    Pytorch基础-tensor数据结构
    C语言 || volatile
    docker安装elasticsearch7.8和kibana7.8
    【10套模拟】【8、9】
    72. 编辑距离
    App移动端测试【10】Monkey自定义脚本案例
    对数据去趋势处理方法
  • 原文地址:https://blog.csdn.net/qq_42434171/article/details/126850549