摘要:
一种常用的方法是将「买入」和「卖出」分开进行考虑:「买入」为负收益,而「卖出」为正收益。在初入股市时,你只有「买入」的权利,只能获得负收益。而当你「买入」之后,你就有了「卖出」的权利,可以获得正收益。显然,我们需要尽可能地降低负收益而提高正收益,因此我们的目标总是将收益值最大化。因此,我们可以使用动 阅读全文
摘要:
和123. 买卖股票的最佳时机 III一样的DP解法。 注意对$0$的特判。 class Solution { public: int f[1010][2][110]; int maxProfit(int k, vector<int>& prices) { int n=prices.size(); 阅读全文
摘要:
状态表示: \(f(i,0,k)\):表示当前为第$i$天,手里没有股票,交易次数不超过$k$次的最大利润; \(f(i,1,k)\):表示当前为第$i$天,手里有股票,交易次数不超过$k$次的最大利润。 状态转移: 第$i$天手里没有股票有两种情况: 第$i-1$天手里没有股票; 第$i-1$天手 阅读全文
摘要:
题意 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 阅读全文
摘要:
摘花生+LIS(要取得当前格子的物品,这个物品必须比当前所拥有的物品都大,所以物品的重量严格递增)的结合题。 状态表示:\(f(i,j,k,c)\):当前到达$(i,j)$位置,已经取了$k$件物品,且最后一件物品的重量为$c$。 状态转移:$(i,j)\(可以从\)(i-1,j)\(抵达,也可以从 阅读全文
摘要:
暴力思路为枚举每个人的分数,将当前分数作为阈值,统计预测正确的个数,取预测正确个数最大的作为最终的阈值,复杂度为:\(O(n^2)\)。 我们可以先将所有人的分数排个序,这样在枚举第$i$个人的分数作为阈值时,$1 \sim i-1$的分数都小于$i$,$i+1 \sim n$的分数都大于$i$。 阅读全文
摘要:
暴力的做法是$O(n^2)$,枚举左右端点$l$和$r$,通过前缀和计算出$sum[l \sim r] = sum[r] - sum[l-1]$,但不足以通过此题。 题意可转化为:找两个端点$l$和$r$,使得$sum[l \sim r]%k = (sum[r] - sum[l-1])%k == 0 阅读全文
摘要:
直接暴力枚举所有状态,时间复杂度:\(O(2^{16} \times 4^3)\) const int N=5; bool g[N][N],tmp[N][N]; int n=4,m=4; bool check(int x,int y) { return x>=0 && x<n && y>=0 && 阅读全文
摘要:
和95. 费解的开关同题。 暴力总共有$2^$种翻转的方法。 先确定第一行的翻转方式,然后可以很容易判断这样是否存在解以及解的最小步数是多少,最上面一行的翻转方式共有$O(2M)$种,复杂度为$O(NM2M)$。 const int N=20; bool g[N][N],tmp[N][N]; int 阅读全文
摘要:
首先我们需要枚举$K$,对每个$K$我们都要从最左端开始来考虑$N$头牛的情况,此时最坏情况下需要进行$N-K+1$次反转操作,而每次操作又要反转$K$头牛,于是总的复杂度为$O(N^3)$。 对区间反转的部分考虑使用差分,每次只修改$i \sim i+k−1$,通过前缀和求解每一位是否反转。 反转 阅读全文