当前位置: 首页> 房产> 家装 > h5游戏是什么_烟台网站制作这_编程培训班学费一般多少钱_最新地址

h5游戏是什么_烟台网站制作这_编程培训班学费一般多少钱_最新地址

时间:2025/7/10 0:45:10来源:https://blog.csdn.net/qq_55391775/article/details/145544240 浏览次数:0次
h5游戏是什么_烟台网站制作这_编程培训班学费一般多少钱_最新地址

1. 买卖股票的最佳时机

算法思路

1. 用二维dp数组表示股票的状态,即持有和不持有;
2. 递推公式:dp[i][0] = Math.max(dp[i-1][0], -prices[i]);dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0]+prices[i]);
3. 初始化;
4. 从前往后遍历。

注意点

要考虑数组为0或者null的特殊情况。

代码

class Solution {public int maxProfit(int[] prices) {if(prices == null || prices.length == 0) return 0;// dp[i][0]表示第i天持有这支股票的最大价值,dp[i][1]表示第i天不持有这支股票的最大价值int[][] dp = new int[prices.length][2];dp[0][0] = -prices[0];dp[0][1] = 0;for(int i = 1; i<prices.length; i++){dp[i][0] = Math.max(dp[i-1][0], -prices[i]);dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0]+prices[i]);}return dp[prices.length-1][1];}
}

2. 买卖股票的最佳时机II

算法思路

 第 i 天持有股票的最大价值为:在持续第 i-1 天的持有股票价值和 在第 i 天买入股票,即dp[i-1][1]-prices[i] 所得价值中华取最大值,由于可以多次买卖股票,所以在买股时,前面不持有股票的dp 不为0。

注意点

代码

class Solution {public int maxProfit(int[] prices) {if (prices == null || prices.length == 1) return 0;// dp[i][1]表示第i天持有这支股票的最大价值,dp[i][0]表示第i天不持有这支股票的最大价值int[][] dp = new int[prices.length][2];dp[0][1] = -prices[0];dp[0][0] = 0;for(int i = 1; i<prices.length; i++){dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] - prices[i]);dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]);}return dp[prices.length-1][0];}
}

2. 买卖股票的最佳时机III

算法思路

列举出四个状态:
1.  第一次持有股票;
2. 第一次不持有股票;
3. 第二次持有股票;
4. 第二次不持有股票。

注意点

代码

class Solution {public int maxProfit(int[] prices) {if(prices == null || prices.length == 0) return 0;int[][] dp = new int[prices.length][5];dp[0][1] = -prices[0]; // 第一次持有股票dp[0][2] = 0; // 第一次不持有dp[0][3] = -prices[0]; // 第二次持有股票dp[0][4] = 0; // 第二次不持有for(int i = 1; i<prices.length; i++){dp[i][1] = Math.max(dp[i-1][1], -prices[i]);dp[i][2] = Math.max(dp[i-1][2], dp[i-1][1]+prices[i]);dp[i][3] = Math.max(dp[i-1][3], dp[i-1][2]-prices[i]);dp[i][4] = Math.max(dp[i-1][4], dp[i-1][3]+prices[i]);}return dp[prices.length-1][4];}
}

4. 买卖股票的最佳时机IV

算法思路

1. 有k笔交易,意味着有2*k次买入卖出;
2. 遍历时分为奇数和偶数,奇数表示持有,偶数表示不持有;
3. j 从0开始遍历更合适,可以同时表示奇数和偶数。

注意点

即使某一次达到最大值,之后的股票也可以在当天买入再卖出,不影响最大利润,可以直接输出dp[prices.length-1][2*k]。

代码

class Solution {public int maxProfit(int k, int[] prices) {if(prices == null || prices.length == 0) return 0;// k笔交易就是2*k次买入卖出int[][] dp = new int[prices.length][2*k+1];for(int j = 0; j<2*k; j+=2){dp[0][j+1] = -prices[0]; // 奇数,持有股票dp[0][j+2] = 0; // 偶数, 不持有股票}for(int i = 1; i<prices.length; i++){for(int j = 0; j<2*k; j+=2){dp[i][j+1] = Math.max(dp[i-1][j+1], dp[i][j] - prices[i]); // 奇数,持有股票dp[i][j+2] = Math.max(dp[i-1][j+2], dp[i][j+1] + prices[i]); // 偶数, 不持有股票}}return dp[prices.length-1][2*k];}
}
关键字:h5游戏是什么_烟台网站制作这_编程培训班学费一般多少钱_最新地址

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: