描述
给定一支股票若干天的价格。
你只能选择某一天买入这支股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。
输入
第一行为n(1≤n≤105),表示天数。
第二行为n个整数ai (0≤ai≤104),ai表示第i天的股票价格。
输出
输出最大利润,如果你不能获取任何利润,输出0。
样例输入
6
7 1 5 3 6 4
样例输出
5
题解
dp数组含义
dp[i][0]:到为止第i天持有的最大收益
dp[i][1]:到为止第i天不持有的最大收益
dp数组初始化
到为止第1天持有的最大收益为-w[0]
dp数组递推公式:
因为只能买卖一次,所以是-w[i],而不是dp[i-1][1]-w[i];
本天持有的状态只有可能从前一天持有的状态和前一天不持有本天买入来,不持有的状态一样
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int dp[N][2],w[N];
//dp数组含义
//dp[i][0]:到为止第i天持有的最大收益
//dp[i][1]:到为止第i天不持有的最大收益
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>w[i];
//dp数组初始化
//到为止第1天持有的最大收益为-w[0]
dp[0][0]=-w[0];
dp[0][1]=0;
for(int i=1;i<n;i++){
//因为只能买卖一次,所以是-w[i],而不是dp[i-1][1]-w[i];
dp[i][0]=max(dp[i-1][0],-w[i]);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+w[i]);
}
cout<<dp[n-1][1];
}