题目
已知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;
}
本文介绍两种求解股票最大收益的方法:枚举法与动态规划法。枚举法通过逐一比较买入卖出日期来寻找最大利润;动态规划法则记录最低股价并以此更新最大收益。
1641

被折叠的 条评论
为什么被折叠?



