摘要:USACO是USA Computing Olympiad的简称,它组织了很多面向全球的计算机竞赛活动。 USACO Trainng是一个很适合初学者的题库,我认为它的特色是题目质量高,循序渐进,还配有不错的课文和题目分析。其中关于背包问题的那篇课文 (TEXT Knapsack Problems)
阅读全文
随笔分类 - 数据结构与算法
摘要:USACO是USA Computing Olympiad的简称,它组织了很多面向全球的计算机竞赛活动。 USACO Trainng是一个很适合初学者的题库,我认为它的特色是题目质量高,循序渐进,还配有不错的课文和题目分析。其中关于背包问题的那篇课文 (TEXT Knapsack Problems)
阅读全文
摘要:《背包问题九讲》的本意是将背包问题作为动态规划问题中的一类进行讲解。但鉴于的确有一些背包问题只能用搜索来解,所以这里也对用搜索解背包问题做简单介绍。大部分以01背包为例,其它的应该可以触类旁通。 简单的深搜 对于01背包问题,简单的深搜的复杂度是O(2^N)。就是枚举出所有2^N种将物品放入背包的方
阅读全文
摘要:动态规划之 二维费用的背包问题 1. 问题描述 二维费用的背包问题是指对于每件物品,具有两种不同的费用,选择这件物品必须同时付出这两种代价,对于每种代价都有一个可付出的最大值(背包容量),求选择物品可以得到最大的价值。 例如,有一个背包,它的容量为V,它的重量限制为U。有N件物品,第i件物品的体积为
阅读全文
摘要:1. 问题 背包问题是一类经典的动态规划问题,它描述了一个人在有限的背包容量下,如何选择一些物品装入背包,使得物品的总价值最大。 根据物品的不同特征和限制条件,背包问题可以分为以下三种基本类型: 01背包:每种物品只有一件,可以选择放或不放。 完全背包:每种物品有无限件,可以选择放任意件。 多重背包
阅读全文
摘要:题目 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本思路 这个问题非常类似于01背包问题,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并
阅读全文
摘要:题目 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状
阅读全文
摘要:动态规划入门指南 动态规划是一种解决复杂问题的方法,它可以将一个问题分解为若干个子问题,并利用子问题的最优解来构造原问题的最优解。动态规划适用于具有重叠子问题和最优子结构的问题,即子问题之间有相互依赖的关系,且子问题的最优解可以推导出原问题的最优解。 本文将介绍动态规划的基本概念、常见模式、解题框架
阅读全文
摘要:快速排序及其实现 快速排序是一种高效而常用的排序算法,它的基本思想是通过选择一个基准元素,将数组分成两个子数组,其中一个子数组中的元素都小于基准元素,另一个子数组中的元素都大于基准元素,然后对这两个子数组递归地进行快速排序,从而实现整个数组的排序。快速排序的平均时间复杂度为O(nlogn),最坏时间
阅读全文
摘要:归并排序及其实现 归并排序是一种基于分治思想的排序算法,它的基本思想是将一个大的数组分成两个或多个小的数组,对每个小的数组进行排序,然后将这些有序的小数组合并成一个大的有序的数组。归并排序的时间复杂度为O(nlogn),空间复杂度为O(n),是一种稳定的排序算法。 归并排序的思想和本质是: 分治:将
阅读全文
摘要:1. 题目 读题 https://leetcode.cn/problems/generate-parentheses/ 这道题的题目描述是这样的: 给定一个整数n,表示括号对的数量,写一个函数来生成所有可能的有效括号组合。¹ 有效括号组合的意思是,每个左括号都有一个对应的右括号,并且括号之间的嵌套关
阅读全文
摘要:1. 题目 https://leetcode.cn/problems/basic-calculator/ 2. 解法 解题思路: 使用两个栈,一个存储数字,一个存储运算符 遍历字符串,如果遇到数字,就将其转换为整数并压入数字栈 如果遇到运算符,就比较其与运算符栈顶的优先级,如果高于或等于栈顶的优先级
阅读全文
摘要:一、基本概念 字符串匹配是计算机科学领域中最古老、研究最广泛的问题之一,层出不穷的前辈们也总结了非常多经典的优秀算法,例如 BF 算法、RK 算法、BM 算法、KMP 算法,今天我介绍的主角是 BM 算法。 字符串匹配可以简单概括为前缀匹配,后缀匹配,子串匹配,下面的讲解我都以最常见的子串匹配为例。
阅读全文
摘要:BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算
阅读全文
摘要:/** * rk字符串匹配算法,主要引入了hash的概念, * 利用子串的hash值依次对比主串相应长度的子串hash值 * 并对hash值相同的子串进行匹配对比 */ public class RKSearch { /** * rk算法入口 * @param t 主字符串 * @param p 子
阅读全文
摘要:https://zhuanlan.zhihu.com/p/431240843 1 递归算法 1.1 算法策略 1.2 适用场景 1.3 使用递归算法求解的一些经典问题 DOM树为例 2 分治算法 2.1 算法策略 2.2 适用场景 2.3 使用分治法求解的一些经典问题二分查找 3 贪心算法 3.1
阅读全文
摘要:贪心算法的产生背景是什么?它主要解决的是哪一类的问题?这些问题可以总结成一个固定的什么样的模型? 产生背景没了解过,但是我以前学建模的时候是这样理解的: 贪心算法是一种思路,而非固定的操作方法;贪心算法叫短视算法更贴切,因为它只考虑当前最佳的解决方法。至于它能解决哪类问题,我认为使用它并不一定能“解
阅读全文
摘要:每次做选择的时候都做出当下最好的选择,而不考虑将来的后果。并且期望最终得到的结果是全局最优的。 ——贪心算法 - Greedy Algorithm 什么时候该使用贪心算法 针对一组数据,定义了限制值。现在需要我们从中选出几个数据,在满足限制值的情况下,使期望值最大。 这个不难理解,比如知乎上这个很火
阅读全文
摘要:前言 在上一篇文章动态规划的文章中,我们先由 Fibonacci 例子引入到了动态规划中,然后借助兑换零钱的例子,分析了动态规划最主要的三个性质,即: 重叠子问题 最优子结构 状态转移方程 但是动态规划远不止这么简单。 今天这篇文章,让我们深入动态规划,一窥动态规划的本质。 我们既然要彻底搞清楚动态
阅读全文
摘要:前言 我们刷leetcode的时候,经常会遇到动态规划类型题目。动态规划问题非常非常经典,也很有技巧性,一般大厂都非常喜欢问。今天跟大家一起来学习动态规划的套路,文章如果有不正确的地方,欢迎大家指出哈,感谢感谢~ 什么是动态规划? 动态规划的核心思想 一个例子走进动态规划 动态规划的解题套路 lee
阅读全文
摘要:一、动态规划三板斧 状态转移公式 循环 或 递归 性能优化 二、WHY 1、状态转移公式 动态规划与分治不一样,分治的问题是相互独立的,而动态规划的各个状态是有关联关系的。比如背包问题,你选择了 i 物品之后,背包的剩余容量要发生变化吧,对装别的物品就有影响了。 状态转移公式就是刻画这种关联的,一旦
阅读全文
|