股票两次买卖最大收益(java)

题目:一个人一天只能进行最多两次买和两次卖,并且只有卖了才能继续买。问一天可以获得的最大收益,要采用时间复杂度低的实现。

输入:5 2,4,6,8,10.输出:8 (2买,10卖) 

输入:6 10,22,5,75,65,80.输出:87  (10买,22卖,5买,80卖)

动态规划解决方法:设置数组dp[i][j]表示:prices[i]买入到prices[j]卖出的收益。则得出dp[i][j]为

0 12 -5  65  55 70  
0  0 -17 53  43 58  
0  0   0  70  60 75  
0  0   0   0 -10  5  
0  0   0   0   0  15  
0  0   0   0   0   0 

然后:先找出最大值的位置和买入卖出的时间,题中是75最大,买入i=2,卖出j=5

然后根据买入卖出的时间,算出除此之外时间段的最大值

代码如下:

 

public static int maxProfit(int[] prices, int length) {
int res = 0;
int dp[][] = new int[length][length];
for (int i = 0; i < length - 1; i++) {
for (int j = i + 1; j < length; j++) {
dp[i][j] = prices[j] - prices[i];
System.out.print(dp[i][j] + " ");
}
}
int max = 0;
int ma2 = 0;
int start = 0;
int end = 0;
for (int i = 0; i < length; i++)
for (int j = i + 1; j < length; j++) {
if (dp[i][j] > max) {
max = dp[i][j];
start = i;
end = j;
}
}
System.out.println(start + " " + end + " " + max);
for (int i = 0; i < start; i++)
for (int j = i + 1; j < start; j++) {
if (dp[i][j] > ma2) {
ma2 = dp[i][j];
}
}
if (end < length - 1)
for (int i = end + 1; i < length; i++) {
for (int j = i + 1; j < length; j++) {
if (dp[i][j] > ma2) {
ma2 = dp[i][j];
}
}
}
res = max + ma2;
return res;
}

转载于:https://www.cnblogs.com/hirampeng/p/9700646.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值