题目:
吐槽:1)只要你理解题目,当天卖了可以再当天买2)只要你炒过股做波段可以降低成本。就可以很容易A掉这个题目
代码:
贪心算法
public static int maxProfit1(int[] prices) {
//返回结果最多能赚多少钱
int result = 0;
for(int i =1;i<prices.length;i++){
//只要后一天比前一天贵就做这两天的股票
if(prices[i] - prices[i-1]>0){
result+=prices[i] - prices[i-1];
}
}
return result;
}
动态规划
/**
*
* 动态规划版本:
* 真实的交易状态就是买了股票,又卖了股票,赚了钱才算一次交易成功,也就是dp[i][0]里的值
* dp[i][0]:表示今天钱最多的状态是多少钱(真实交易了的收益状态)
* :1)不买股票,一直下跌。
* 2)买股票赚钱了。
* dp[i][1]: 表示买了一手股票的情况下,做多留下的钱。(保存的最优状态,购买最低股价的状态,还没有进行交易)
* :当股票一直下跌,dp[i][1]表示如果买股票,最低点的位置
* 当股票上涨,dp[i][1]表示买股票,最低点的位置
*整逻辑就是,股价下降区间,dp[i][0]一直是钱最多的状态(不曾改变)。dp[i][1]一直在被赋值即股价最低时持有1股和剩余钱的状态(值一直改变)。
* 股价上涨区间,dp[i][0]一直是钱最多的状态(一直改变,在赚钱)。dp[i][1]一直是股价最低的时候持有1股和剩余钱的状态(值一直不变)。
* @param prices
* @return
*/
public static int maxProfit1(int[] prices) {
if(prices==null||prices.length==0||prices.length == 1){
return 0;
}
//返回结果最多能赚多少钱
int[][] dp = new int[prices.length][2];
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i = 1;i<prices.length;i++){
//当天钱最多的状态
dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
//买了一股当前波段最低点的股票和赚的剩余的钱(具体举几个例子好好分析一下,上升波段,下降波段,先下再上波段,
//你会发现,保存的都是买了一手最底部股价后的价钱总和)
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);
}
return dp[prices.length-1][0];
}