随笔分类 - dp
摘要:https://leetcode-cn.com/problems/new-21-game/solution/xin-21dian-by-leetcode-solution/ (待整理) (dp 公式的一个转换就可以了)
        阅读全文
            
摘要:待整理 (和974的思路有点相仿,对于$O(N^{2})$的算法,考虑用hash降低一下复杂度,这里的hash的设计方式就不错)
        阅读全文
            
摘要:题目描述: 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。 返回获得利润的最大值。注意:这里的一笔交易指
        阅读全文
            
摘要:题目描述: 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 题解: 类似leetcode 211,定义$dp(i,j)$表示以(i,j)为右下角的矩阵的最大宽(注意这里要求的是矩形)。相较于求解正方形的面积,求解矩形的面积要麻烦一些,这里的宽可以通过$dp$
        阅读全文
            
摘要:题目描述: 在一个由0和1组成的矩阵内,找到只包含1的最大正方形的最大面积。 题解: 考虑动态规划。用$dp(i,j)$表示以$(i,j)$为右下角,且只包含1的正方形的边长的最大值。状态可以参考(leetcode 1277),如下: 如果当前位置为0,$dp(i,j) = 0$ 如果当前位置为1,
        阅读全文
            
摘要:贴一个板子(之前快手笔试的时候写错了..奇耻大辱) 先给出两个公式:$C^{n}_{m} = \frac{m!}{m!(m-n)!}$以及 $C^{n}_{m} = C^{n-1}_{m-1} + C^{n}_{m-1}$ 计算代码如下: int mat[1001][1001]; int combi
        阅读全文
            
摘要:题目描述: 给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)。例如n = 5的时候,结果为2(5 = 5 , 5 = 1+1+1+1+1) 题解: 定义dp[i]表示和为i的时候有几种分法。这里状态的转移要注
        阅读全文
            
摘要:题目描述: 给定一个由0和1组成的矩阵,找出每个元素到最近0的距离,两个相邻元素间的距离为1. 题解: BFS: 先考虑只有一个零的情况,那么只需要从这个零出发BFS更新距离就好。现在矩阵中有多个零,那么我们将这个多个零看作同一层(也可以理解为一个零的集合),然后以这个集合为起点同步BFS即可。举个
        阅读全文
            
摘要:题目描述: 给定正整数 N,返回小于等于 N 且具有至少 1 位重复数字的正整数。 题解: 求至少有1位重复数字的正整数有点复杂,转换一下思路,求小于等于N没有重复数字的正整数的个数。定义一个$dp[pos][status][bound]$(dp定义解释戳这里)。这里的$status$借用了一下状压
        阅读全文
            
摘要:题目描述: 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 题解: 把amount看作背包容量,把coins[i]看作value[i]为1、weight[i]为coins[i]的物品
        阅读全文
            
摘要:题目描述: 题解:仿照最大连续子序列和的思路构造dp。dp_min[i]表示以nums[i]为结尾的子序列的最小乘积、dp_max[i]表示以nums[i]为结尾的子序列的最大乘积。 当nums[i] > 0的时候 dp_max[i] = max(nums[i],nums[i]*dp_max[i-1
        阅读全文
            
摘要:题目描述: 题解: 和139类似,dp[i]表示子串s[0:i]能够由词典里的单词组成。题目要求返回所有可能的句子,那么额外需要用一个辅助数组存储到位置i为止所有可能的句子。在求解之前先判断一下是否有解,不事先判断的话题目有一个样例会爆 内存。 AC代码: vector<string> wordBr
        阅读全文
            
摘要:题目描述: 题解:一开始的时候想着用区间dp。dp[i][j]表示s[i~j]分割为会文子串的最少分割次数。状态转移也很简单,要么s[i~j]本身是回文串不需要分割; 要么枚举分隔点K,dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+1);代码如下: clas
        阅读全文
            
摘要:题目描述: 题解: 这题和编辑距离类似,构造一个dp[i][j]表示从字符串s前i个字符组成的s_sub,字符串t前j个字符组成的t_sub,s_sub中包含t_sub的个数。状态转移也不难想无非是dp[i-1][j]以及dp[i-1][j-1]。当s[i-1] == t[j-1]的时候, dp[i
        阅读全文
            
摘要:题目描述: 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。 在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点,然后交换它的两个子节点。 例如,如果我们挑选非叶节点 "gr" ,交换它的两个子节点,将会产生扰乱字符串 "rgeat" 。 我们将 "rgta
        阅读全文
            
摘要:题目描述: 题解: 考虑到一个学术只能看到同一行或者前一行同学的试卷,具有一定的顺序,考虑动态规划。考虑状压dp,定义dp[i][j]表示到i行为止,第i行状态为j时的 最大可坐学生个数,其中j用二进制展开,为1的位置表示坐了学生。状态转移方程为dp[i][j] = max(dp[i-1][k]+k
        阅读全文
            
摘要:题目描述: 题解:令dp[i]为从位置i开始所能访问的最大下标数。转移方程为dp[i] = max(dp[i],dp[j]+1),j为位置i可达点的下标。自底向上更新的dp,优先把位置低的点d更新出来即可。 (一开始一直没有找到合适的有序遍历方法,其实排序一下就好了 ) AC代码: int maxJ
        阅读全文
            
                    
                
浙公网安备 33010602011771号