摘要:
用dp表示总价值 用dp表示组合数 给出一个总数,一些物品,问能否凑成这个总数。 零钱兑换II https://leetcode.cn/problems/coin-change-ii/ 完全背包 二维写法 for (int i = 0; i < weight.size(); i++) { // 遍历 阅读全文
摘要:
思路 尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 背包问题: dp定义:dp[i]表示在容量为i的背包最多可放下重量为dp[i]的石头 递推公式:dp[i]=max(dp[i],dp[i-stones[i]]+stones[i]),要么不选当前的石头(沿用遍历 阅读全文
摘要:
思路 难点 我只想到了:“找一个子集,每个数取或不取求其和,看是否和另一个子集的和相等 ” 但是实际上既然是两个子集相等,那么只要和等于 sum/2 即可了! 取或不取用01背包,但是不知道怎么用。 只有确定了如下四点,才能把01背包问题套到本题上来。 背包的体积为sum / 2 背包要放入的商品( 阅读全文
摘要:
暴力:每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是O(2^n),这里的n表示物品数量。 所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化! 二维dp数组01背包 确定dp数组及下标含义 dp[i][j]表示前i件物品恰放入一个 阅读全文
摘要:
解题思路 本题通过递归 和 二叉搜索树特性解决。 当n=1时,结果是1。如果n>1时,因为根节点值不同对应的二叉搜索树肯定不同,所以我们考虑根为i(2≤i≤n)的情况。 由二叉搜索树特性,根左边一定有i-1个元素,右边一定有n-i个元素。 设f(i)函数返回i个不同元素节点组成的二叉搜索树的个数。所 阅读全文
摘要:
动态规划题目应该如何debug,灵魂三问: 这道题目我举例推导状态转移公式了么? 我打印dp数组的日志了么? 打印出来了dp数组和我想的一样么? 阅读全文
摘要:
思路 这道题目首先要想,如何放置,才能让摄像头最小的呢? 从题目中示例,其实可以得到启发,我们发现题目示例中的摄像头都没有放在叶子节点上! 这是很重要的一个线索,摄像头可以覆盖上中下三层,如果把摄像头放在叶子节点上,就浪费的一层的覆盖。 所以把摄像头放在叶子节点的父节点位置,才能充分利用摄像头的覆盖 阅读全文
摘要:
思路 显然本题要对数字按位处理,转化为字符串更好处理。 既然要尽可能的大,那么这个数从高位开始要尽可能地保持不变。 那么我们找到从高到低第一个满足 str[i]>str[i+1] 的位置,然后把 str[i]−- ,再把后面的位置都变成 9 即可 但是由于减小了 str[i] 以后,可能不满足 st 阅读全文
摘要:
代码 class Solution { public: static bool cmp(vector<int>& a,vector<int>& b){ if(a[0] == b[0])return a[1]<b[1];//如果身高相同,k更小的在前面 return a[0] > b[0];//身高不 阅读全文
摘要:
思路 一开始受到“摆动序列”的影响画图,有想过从左往右遍历,if当前孩子大于左孩子就比左孩子大1,else if大于右孩子就比右孩子大1 这样能保证“相邻两个孩子评分更高的孩子会获得更多的糖果。”但是不能保证每个人至少有1个糖果。 于是又想从右向左遍历,对于糖果数小于1个的做处理,此时发现很难通过一 阅读全文