算法提高之股票买卖 IV
-
核心思想:状态机
- 状态表示f[i,j,k]:考虑前 i 天的股票,第 i 天的 决策 是 k,且完成的 完整交易数 为 j 的方案
- **状态计算:f[i,j,0]=max(f[i−1,j,0],f[i−1,j−1,1]+wi) **
- f[i,j,1]=max(f[i−1,j,1],f[i−1,j,0]−wi)
-
#include <iostream> #include <cstring> using namespace std; const int N = 1e5 + 10, M = 110; int n, k; int w[N]; int f[N][M][2]; int main() { cin>>n>>k; for(int i=1;i<=n;i++) cin>>w[i]; memset(f,-0x3f,sizeof f); //初始化 f[0][0][0] = 0; for(int i=1;i<=n;i++) { for(int j=0;j<=k;j++) { f[i][j][0] = f[i-1][j][0]; if(j) f[i][j][0] = max(f[i-1][j][0],f[i-1][j-1][1]+w[i]); f[i][j][1] = max(f[i-1][j][1],f[i-1][j][0] - w[i]); } } int res=0; for(int i=1;i<=k;i++) res = max(res,f[n][i][0]); cout<<res<<endl; return 0; }