股票买卖 IV DP 状态机 java

🍑 OJ专栏


🍑 股票买卖 Ⅳ

在这里插入图片描述

输入

3 2
2 4 1

输出

2

输入

6 2
3 2 6 5 0 3

输出

7

在这里插入图片描述

🍑 状态机

🍤 f[k][i][j]:表示在前 i 支股票中考虑,完成了j次交易,且当前状态为 k(0为空仓,1为持仓)
🍤 j:买入就 +1,卖出不处理(买入卖出才算一次完整的交易)
import java.io.*;
import java.util.*;

public class Main
{
	static int N = 100010, INF = 0x3f3f3f3f;
	static int M = 110;
	static int[][][] f = new int[2][N][M];
	static int[] w = new int[N];

	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

	public static void main(String[] args) throws IOException
	{
		Scanner sc = new Scanner(System.in);
		String[] ss = in.readLine().split(" ");
		int n = Integer.parseInt(ss[0]);
		int k = Integer.parseInt(ss[1]);

		ss = in.readLine().split(" ");
		for (int i = 1; i <= n; i++)
			w[i] = Integer.parseInt(ss[i - 1]);


        //开始时:所有的持仓状态都是非法的(因为所有持仓状态都有可能影响后边的结果)
		for (int i = 0; i <= n; i++)
			for (int j = 0; j <= k; j++)
				f[1][i][j] = Integer.MIN_VALUE / 2;

//		DP
		int res = 0;
		for (int i = 1; i <= n; i++)// 枚举物品
		{
			for (int j = 1; j <= k; j++)// 枚举交易次数
			{
				//当前空仓              前一天空仓          前一天卖出(不算一次交易,只算完成交易)
				f[0][i][j] = Math.max(f[0][i - 1][j], f[1][i - 1][j] + w[i]);
				//当前持仓			   前一天持仓		  前一天买入
				f[1][i][j] = Math.max(f[1][i - 1][j], f[0][i - 1][j - 1] - w[i]);
				res = Math.max(res, f[0][n][j]);
			}
		}
		System.out.println(res);
	}
}

👨‍🏫 参考题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值