优快云每日一练——小股炒股

本文介绍两种求解股票最大收益的方法:枚举法与动态规划法。枚举法通过逐一比较买入卖出日期来寻找最大利润;动态规划法则记录最低股价并以此更新最大收益。

题目 

已知n天后的股票行情,现在已有的本金是m, 规定只能入手一次股票和抛售一次股票。 最大收益(含本金)是?

输入描述

第一行输入整数n,m。(1<=n<=1000,1<=m<=10000) 第二行输入n个整数表示某股票单股价格p。(1<=p<=1000)

输出描述

输出最大收益(含本金)

方法一:枚举

枚举每天买入和每天出的收益,计算最大值。

时间复杂度:O(N^2)

空间复杂度:O(1)

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include<algorithm>

using namespace std;

int solution(int n, int m, std::vector<int>& vec){
    int result;
    // TODO:
    result=m;
    for(int i=0;i<n;++i){
        for(int j=i+1;j<n;++j){
            int x=m/vec[i];
            result=max(result,m-x*vec[i]+x*vec[j]);
        }
    }
    return result;
}

int main() {

    int n;
    int m;
    std::vector<int> vec;

    std::cin>>n;
    std::cin>>m;
    
    std::string line_0, token_0;
    getline(std::cin >> std::ws,line_0);
    std::stringstream tokens_0(line_0);
    while(std::getline(tokens_0, token_0, ' ')){
        vec.push_back(std::stoi(token_0));
    }
    

    int result = solution(n, m,vec);

    std::cout<<result<<std::endl;

    return 0;
}

方法二: 动态规划

动态规划做题步骤:

1.明确dp[i]表示什么

2.根据dp[i]和dp[i-1]的关系得出状态转移方程

3.确定初始条件

时间复杂度:O(N)

空间复杂度:O(N)

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

int solution(int n, int m, std::vector<int>& vec){
    int result;
    // TODO:
    result=m;
    vector<int> dp(n,m);
    int minprices=vec[0];
    for(int i=1;i<n;++i){
        minprices=min(minprices,vec[i]);
        int x=m/minprices;
        dp[i]=max(dp[i-1],m+x*vec[i]-x*minprices);
    }
    result=dp[n-1];
    return result;
}

int main() {

    int n;
    int m;
    std::vector<int> vec;

    std::cin>>n;
    std::cin>>m;
    
    std::string line_0, token_0;
    getline(std::cin >> std::ws,line_0);
    std::stringstream tokens_0(line_0);
    while(std::getline(tokens_0, token_0, ' ')){
        vec.push_back(std::stoi(token_0));
    }
    

    int result = solution(n, m,vec);

    std::cout<<result<<std::endl;

    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yjf~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值