LeetCode动态规划(下篇共39题)
Posted zhangwanying
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode动态规划(下篇共39题)相关的知识,希望对你有一定的参考价值。
【600】 Non-negative Integers without Consecutive Ones
【629】 K Inverse Pairs Array
【638】 Shopping Offers
【639】 Decode Ways II
【646】 Maximum Length of Pair Chain
【647】 Palindromic Substrings
【650】 2 Keys Keyboard
【651】 4 Keys Keyboard
【656】 Coin Path
【664】 Strange Printer
【673】 Number of Longest Increasing Subsequence
【688】 Knight Probability in Chessboard
【689】 Maximum Sum of 3 Non-Overlapping Subarrays
【691】 Stickers to Spell Word
【698】 Partition to K Equal Sum Subsets
【712】 Minimum ASCII Delete Sum for Two Strings
【714】 Best Time to Buy and Sell Stock with Transaction Fee (算法群 2018年10月22日题目)
还是股票买卖的相关问题,给了一个股票价格的数组,prices[i] 代表第 i 天的股票价格,每次卖出要交手续费,问最后的max profit 是多少。
题解:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/discuss/108892/Java-DP-solution-O(n)-to-O(1)-space
这题可以用滚动数组(两个变量优化成O(1)的空间复杂度),但是优化后的不好理解,而且这种优化也不算什么高端技巧。所以我们这里先讨论下这题 dp 的本质。
我们第 i 天要么持有股票,要么不持有股票。 我们用 hold[i] 表示第 i 天持有股票的 max profit, unhold[i] 表示第 i 天不持有股票的 max profit。
那么转移方程可以这么理解: 我们在第 i 天有两种情况,要么我们持有股票,要么我们不持有股票。
1. 第 i 天持有股票的情况下, hold[i] = max(hold[i-1], unhold[i-1] - prices[i]) //意思是说我们要么第 i-1 天就持有股票, 第 i 天啥也不干; 要么我们在第 i 天买了股票
2.第 i 天不持有股票的情况下, unhold[i] = max(unhold[i-1], hold[i-1] + prices[i] - fee) //意思是说我们 第 i-1 天就不持有股票了,第 i 天啥也不干; 要们我们在第 i 天卖了股票
现在的时间复杂度是O(N), 空间复杂度是O(1)。可以用两个变量优化两个数组。
1 class Solution {
2 public:
3 //hold[i] represents max profit of holding stock until day i
4 //nothold[i] represents max profit of not holding stock until day i
5 //transaction function: for each day i, we have 2 situations.
6 //1. hold stock in day i (you can either do nothing in day i or buy stock int day i)
7 // hold[i] = max(hold[i-1], nothold[i-1]-price[i])
8 //2. not hold stock in day i (you can either do nothing in day i or sell stock in day i)
9 // nothold[i] = max(nothold[i-1], hold[i-1] + price[i] - fee)
10
11 int maxProfit(vector<int>& prices, int fee) {
12 const int n = prices.size();
13 if (n <= 1) { return 0; }
14 vector<int> hold(n, 0), unhold(n, 0);
15 hold[0] = -prices[0], unhold[0] = 0;
16 for (int i = 1; i < n; ++i) {
17 hold[i] = max(hold[i-1], unhold[i-1] - prices[i]);
18 unhold[i] = max(unhold[i-1], hold[i-1] + prices[i] - fee);
19 }
20 return unhold[n-1];
21 }
22 };
【718】 Maximum Length of Repeated Subarray
【727】 Minimum Window Subsequence
【730】 Count Different Palindromic Subsequences
【740】 Delete and Earn
【741】 Cherry Pickup
【746】 Min Cost Climbing Stairs
【750】 Number Of Corner Rectangles
【764】 Largest Plus Sign
【787】 Cheapest Flights Within K Stops
【790】 Domino and Tromino Tiling
【801】 Minimum Swaps To Make Sequences Increasing
【808】 Soup Servings
【813】 Largest Sum of Averages
【818】 Race Car
【837】 New 21 Game
【838】 Push Dominoes
【847】 Shortest Path Visiting All Nodes
【871】 Minimum Number of Refueling Stops
【873】 Length of Longest Fibonacci Subsequence
【877】 Stone Game
【879】 Profitable Schemes
【887】 Super Egg Drop
以上是关于LeetCode动态规划(下篇共39题)的主要内容,如果未能解决你的问题,请参考以下文章