代码
class Solution { public int maxProfit(int[] p) { /** * 1.确定dp数组以及下标含义 * dp[i][j],第i天状态为j,所生的最多现金为dp[i][j] * j -> 0 状态一:买入股票状态(今天买入股票,或者是之前就买入了股票然后没有操作) * 卖出股票状态 * 1) j -> 1 状态二: 两天前就卖出了股票,度过了冷却期,一直没操作,今天保持卖出股票状态 * 2) j -> 2 状态三: 今天就卖出了股票 * j -> 3 状态四: 今天为冷却器,但冷却状态不可持续。只有一天! */ if( p == null || p.length < 2) return 0; int size = p.length; int [][] dp = new int [size][4]; dp[0][0] = -p[0]; //持有股票 for(int i = 1; i < size; i++ ) { dp[i][0] = Math.max(dp[i - 1][0],Math.max(dp[i - 1][1], dp[i - 1][3]) - p[i]); dp[i][1] = Math.max(dp[i - 1][3],dp[i - 1][1]); dp[i][2] = dp[i - 1][0] + p[i]; dp[i][3] = dp[i - 1][2]; } return Math.max(Math.max(dp[size - 1][1],dp[size - 1][2]), dp[size -1][3]); }}