$\huge \color{orange}{成魔之路->}$ $\huge \color{purple}{算法提高课题解}$
思路:
-
$1. 状态表示$
$集合:从前\ i\ 只股票中选,目前是\ j\ 状态$
$\ \ \ \ \ \ \ \ \ \ \ f[i][0]表示手中有货,f[i][1]表示手中无货的第一天,f[i][2]表示手中无货的大于等于第二天$
$属性:\max$ -
$2. 状态转移$
$手中有货:f[i][0]=\max(f[i-1][0],f[i-1][2]-w[i])$
$手中无货的第一天:f[i][1]=f[i-1][0]+w[i]$
$手中无货的大于等于第二天:f[i][2]=\max(f[i-1][1],f[i-1][2])$
可参考: 股票买卖 IV
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int w[N];
int f[N][3];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>w[i];
memset(f,0xcf,sizeof f);
f[0][2]=0; //入口
for(int i=1;i<=n;i++)
{
//手中有货
f[i][0]=max(f[i-1][0],f[i-1][2]-w[i]);
//手中无货的第一天
f[i][1]=f[i-1][0]+w[i];
//手中无货的大于等于第二天
f[i][2]=max(f[i-1][1],f[i-1][2]);
}
cout<<max(f[n][1],f[n][2])<<endl; //出口
return 0;
}