描述
给定一支股票若干天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。
求你能获得的最大利润 。
输入
第一行为n(1≤n≤105),表示天数。
第二行为n个整数ai (0≤ai≤104),ai表示第i天的股票价格。
输出
输出最大利润,如果你不能获取任何利润,输出0。
样例输入
6
7 1 5 3 6 4
样例输出
7
题解
这道题和股票买卖最佳时机1多了可以多次买卖的条件,在递推公式上改一下就可以ac了
dp数组含义
dp[i][0]:到为止第i天持有的最大收益
dp[i][1]:到为止第i天不持有的最大收益
dp数组初始化
dp[0][0]=-w[0]:到为止第1天持有的最大收益为-w[0]
dp数组递推公式:
dp[i][0]=max(dp[i-1][0],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++){
//本天持有的状态只有可能从前一天持有的状态和前一天不持有本天买入来,不持有的状态一样
dp[i][0]=max(dp[i-1][0],dp[i-1][1]-w[i]);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+w[i]);
}
cout<<dp[n-1][1];
}