2 买卖股票的最佳时机III(动态规划)

来源:

LeetCode第123题

难度:

困难

问题描述:给定一个数组,他的第i个元素是一只给定股票在第i填的价格,涉及一个算法来计算你所能获得的最大利润,你最多能完成两笔交易。

示例1:
输入prices=[3,3,5,0,0,3,1,4]
输出:6
解释:在第4天(股票价格=0)的时候买入,在第6天(股票价格=3)的时候卖出,所能获得的利润(3-0)=3
随后在第7天(股票价格=1)的时候买入,在第8天(股票价格=4)的时候卖出,这笔交易所能获得例如4-1=3
 

public int getMaxProfit(int [] prices)
{
//定义一个二维数组dp[i][j]用来表示在前j天最多进行i次交易的情况下所能获得的最大利润
//申请二维动态规划数组,由于交易次数有0、1、2三种,所以第一维申请3个空间,第二维空间申请
//0-prices.length-1,从而申请prices.length个空间,表示最多交易2次所能获得最大利润
int dp[][]=new int [3][prices.length];
//进行动态规划的第一件事就是初始化dp[0][i]表示前i天不进行任何交易,从而利润均为0
for(int i=0;i

上面的事件复杂度为k*n*2,k为最多交易的次数,由于递推公式dp[i][j]=(第j天进行卖出的最大利润)以及(第j天没有进行买卖交易的的前一天利润),我们可以把-prices[k]+dp[i-1][k-1]看做是在前j-1天买入的最大利润,只要记录这个值即可:
 

public int getMaxProfit2(int [] prices)
{
int dp[][]=new int [3][prices.length];
for(int i=0;i

除此之外还有一种解法使用三维的动态数组用来存储是否持有股票dp[完整交易次数][天数][是否拥有股票],例如dp[0][i][1]表示在第i天完整交易零次,但是手上有股票,dp[0][i][0]表示第i天完整交易0次手上没有股票,dp[1][i][0]表示第i天完整交易一次,但是手上没有股票,dp[2][i][1]是不存在的,从而递推公式为:dp[i][j][0]=Math.max(dp[i][j-1][0],prices[j]+dp[i-1][j-1][1]);dp[i][j][1]=Math.max(dp[i][j-1][1],dp[i][j-1][0]-prices[j]),
 

public int getMaxProfit3(int []prices)
{
int dp[][][]=new int[3][prices.length][2];
for(int i=0;i

总结:java中生成最大值初始值的代码int Max=Interger.MIN_VALUE;大小比较的代码Math.max(a,b);

你可能感兴趣的:(JAVA刷题500道,动态规划,算法,java)