摘要:
题目描述:小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己。有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少,请聪明的你来帮助小虎来解决这个财政问题吧思路1. 面值最小额度, 枚举的话时间复杂度为 o(n^3). 但思考一下就会发现其实这是背包问题恰好装满的变形题2. 背包问题恰好装满是在朴素背包问题的基础上初始化 dp[0] = 0, dp[i] = 负无穷. 这样就会使得不能恰好装满的容量都是负无穷3. 下面的代码设置的是 int dp[], 其实设置成 bool dp[] 也是可以的代码#includ 阅读全文
摘要:
题目描述:最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的。思路Leetcode 原题设置两个游标, 右边游标向右走, 出现重复字符时, 左边的游标向右走代码#include #include #include using namespace std;int myHash[30];char arr[10010];int main() { while(scanf("%s", arr) != EOF) { memset(myHash, 0, sizeof(myHash)); int len = str... 阅读全文
摘要:
题目描述:现在有一个8*8的棋盘,上面放着64个价值不等的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0小于1000),一个人的初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下角,请设计一个算法使其能够获得最大价值的礼物。思路Leetcode 原题dp[i][j] 表示 在第 (i,j) 个格子上能够获得的最大价值的礼物状态转移方程为dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + matrix[i][j]这题不应该再贴上, 不过上次做括号匹配没构造出状态转移方程, 那题与此题思路是类似的状态方程的求解, 阅读全文
摘要:
总结1. 更新动规矩阵时, 不要 push 更新, 要用 pull更新. push 更新容易让逻辑出问题, 自己卡了很久, 改用 pull 就变得很顺利了2. acm 题, 空间至多是百万, 再网上就会超的3. 曾做过一道题, 和这个类似. 好像是背包问题的一个变形把, 核心都是降维. 降维的过程又是一道动规题目题目描述:给定一个大小为n的数组,数组的元素a[i]代表第i天的股票价格设计一个算法,计算在最多允许买卖k次(一买一卖记为一次)的条件下的最大收益需要注意的是,你不能同时拥有两份股票。也就是说在下次买入前,你必须把手头上原有的股票先卖掉思路1. 假设 dp[i][j] 表示前 i 天, 阅读全文
摘要:
题目描述:给定一个整型数组, 求这个数组的最长严格递增子序列的长度。 譬如序列1 2 2 4 3 的最长严格递增子序列为1,2,4或1,2,3.他们的长度为3。思路1. 朴素求解 LIS, 没什么可说的2. 又涉及到二分查找, 这次找的是大于等于 target 的最小值. = 时直接返回, 这就简单了. low > high 时, 返回 low, 因为上一轮比较, mid #include using namespace std;int arr[100010];int record[100010];int search(int x, int low, int high) { if(low 阅读全文
摘要:
题目描述:给定两个整型数组A和B。我们将A和B中的元素两两相加可以得到数组C。譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]。现在给你数组A和B,求由A和B两两相加得到的数组C中,第K小的数字。思路1. 多年前第一次搞这道题就没弄出来, 今天是大概记得做法, 不过 failed again, 总结起来, 仍然是没有意识到 int 的特殊性, 即 (int+int)/2 得到的仍然是 int2. 涉及到二分查找, 用我以前总结的步骤来做, 非常顺利. 核心就是 mid = target, high = mid-1, 尝试向左. 最后返回的应该是 阅读全文
摘要:
题目描述:给定一棵无向树, 我们选择不同的节点作为根节点时,可以得到不同的高度(即树根节点到叶子节点距离的最大值), 现在求这棵树可能的最低高度。思路1. 刚开始题目都没看懂. 树的高度, 指的是根节点到叶节点的最大值, 我们要做的是找到最大值中的最小值2. 查了下资料, 发现这道题是裸求树的直径3. 树的直径可以用动规求解, 但基本的求法是用两次 BFS(DFS)4. BFS 的求解过程为, (1) 从任意节点 u 出发, 找到其能够达到的最远的节点 v (2) 再从 v 出发, 找到其能够达到的最远的节点 o (3) v,o 之间的距离就是树的直径 (4) 直径的一半就是所要求的高度证明 阅读全文