
这题没看懂。。没看懂状态咋分的,每个状态的推导也没看懂。
本题分为四个状态,买入,保持卖出,卖出,冷冻期。
具体状态如图:



本题与股票II的区别就是多了手续费。在卖出时减去手续费的金额即可。
本题分为两种状态:持有股票和不持有股票。
持有股票分为买入/不动状态,不持有股票分为卖出/不动状态。

- public int maxProfit(int[] prices, int fee) {
- int[][] dp=new int[prices.length][2];
- dp[0][0]=-prices[0];
- for(int i=1;i
- dp[i][0]=Math.max(dp[i-1][1]-prices[i],dp[i-1][0]);
- dp[i][1]=Math.max(dp[i-1][0]+prices[i]-fee,dp[i-1][1]);
- }
- return Math.max(dp[prices.length-1][0],dp[prices.length-1][1]);
- }
300. 最长递增子序列

dp解题思路:
①确定dp数组以及下标含义
dp[i]:下标[0,i],以nums[i]结尾的最长子序列长度
②确定递推公式
每次遍历i只决定dp[i]的值,利用j下标遍历[0,i]的所有元素,若有比nums[i]小的元素,则令dp[i]=dp[j](j的最长子序列)长度+1.
每次遍历j都对dp[i]进行判断是否比上次赋值的dp[i]大,取dp[i]的最大值即可。
dp[i]=max(dp[i],dp[j]+1);
注意不是dp[i]与dp[j]+1比较,而是每次都给dp[i]赋值为dp[j]+1,取最大值。
③dp数组如何初始化
给dp数组所有元素都初始化为1,代表初始最长子序列为1.
④确定遍历顺序
从前向后遍历。
⑤举例推导dp数组

注意最后结果返回dp元素的最大值。