经典问题学习笔记
文章平均质量分 67
I_AM_HelloWord
爱好编程信息学
展开
-
经典问题之最大子矩阵
解决问题:给出一个有障碍的矩阵,求出最大不含障碍子矩阵的面积。题解:1.暴力枚举起点终点,检查是否含有障碍,同时打擂台求最大值。O(n^6).2.将障碍设为一个较大的负值,不是障碍的设为1,通过预处理Sum(i,j)表示从(0,0)到(i,j)的子矩阵的元素和,则有Sum(i,j)=Sum(i,j-1)+Sum(i-1,j)-Sum(i-1,j-1)+a(i,j).最后原创 2016-06-11 18:51:18 · 585 阅读 · 1 评论 -
经典问题之01与完全背包总结
01:1.基础题型,伪代码: i= 1 to n j= W to 1 f[j]=max{f[j-w[i]]+v[i]};2.W超大,n=20版;思路:折半枚举,先枚举前十个的选物情况,记录,再枚举后十个的,累计即可。3.W超大,n正常,V较小思路:改变f[j]的定义,设f[j]表示要取价值总和为j的物品最少需要多少多少包重,结果原创 2016-07-13 12:30:24 · 268 阅读 · 0 评论 -
经典问题之多重背包的总结与提升
多重背包:1.基础题型伪代码: i=1 to n j=1 to W k=1 to m[i] f[j]=max{f[j-k*w[i]]+k*v[i]}2.加强版(一)对于数据不是特别紧的可采用二进制法,效率O(nW log m) 解析:对于每个m[i],我们可以分解成2^0+2^1+2^2...+2^k+a(a为m[i原创 2016-07-13 13:10:00 · 853 阅读 · 0 评论 -
多叉树的树形背包常见建模方法
一.多叉树变二叉树。这个技巧其实也有两种具体的方法:树的孩子兄弟表示法与dfs序法。1.树的孩子兄弟表示法。 大家在学习树形结构时一定接触了一个多叉树变二叉树的方法,就是把每个点与它的第一个儿子连边,然后将它的儿子依次连接起来。可以结合下面的图片理解这句话。总结成口诀就是:第一个儿子是左子树,其他儿子是左子树的右子树(似乎并不押韵,手动滑稽)2.dfs序法原创 2017-09-03 20:04:58 · 8956 阅读 · 6 评论 -
经典问题之约瑟夫问题的快速解决
此问题非常经典,在网上即可找到原题,在此不做描述。对于原问题模型,一有链表法解决问题,效率极低,在此描述一种用树状数组完成问题的超快速做法。首先,我们可以有这样递推的思路:不断加k模n,并减去其数字前走了的人即为当前人的真实编号(即是这一轮应踢走的人的编号),如何快速维护每个人其前走了的人的和,答案为树状数组。现在模拟一下过程,假设有6个人,k=3(每报3个,走一个人)。初原创 2016-07-04 13:22:18 · 9964 阅读 · 1 评论 -
经典问题之量化贸易
问题概述:量化贸易的问题根据百度百科结合算法竞赛可以总结为:已知将来n天某商品的价格,每天你可以有三件事(只能做一个):1.不买不卖2.以当天价格买进3.以当天价格卖出刚开始你不持有商品,同时保证n天之后你同样不在持有商品,要求你能获得的最大利润。思路分析:1.裸的二维dp.定义f[i][j]表示第i天持有j件商品的最大利润。依据题目,我们很快可原创 2016-11-02 20:08:23 · 394 阅读 · 0 评论 -
经典问题之合法括号序列
题目描述:给出n,表示在2*n个空位上填(或),使得整个序列是合法的。问总共有多少种方案。分析:显然裸裸的搜索是可以的,但是效率比较低。如果我们定义状态f[i][j],表示前i个空位,还需j个)就是合法序列的方案数。那么就很简单了,f[i][j]=f[i-1][j-1]+f[i-1][j+1]。参考程序:#include#include#include原创 2016-11-11 11:56:46 · 4853 阅读 · 1 评论 -
经典问题之最少交换次数
题目简述:此类题目一般概括为:通过交换相邻数来完成排序所需要的最少交换次数。分析:显然简单的冒泡排序就是基于这种思想,但是O(n^2)的效率常常无法满足题目要求,我们只能另寻它路。还是模拟原始做法:4 8 2 7 5 6 1 31 4 8 2 7 5 6 3------>6次1 2 4 8 7 5 6 3------>2次1 2 3 4 8 7原创 2016-11-03 20:07:50 · 6986 阅读 · 1 评论 -
经典问题之最近点对问题
解决问题:在平面内有n个点,求两两之间的最短距离。题解:1.枚举点,打擂台。O(n^2)2.分治。以中位原创 2016-06-12 12:18:11 · 558 阅读 · 0 评论 -
树状数组拓展笔记
解决问题:给出一组序列,有n个,分别为a1,a2......,an,现有两个操作: 1.A i x把ai的值增加x 2.Q l r把l到r的和求出解决方法:这是树状数组的提出的原因和基本问题,具体将在以后的基础讲解中回顾,直接上代码: struct Bit{ int b[maxn]; int bit(int x){ r原创 2016-06-19 19:21:37 · 844 阅读 · 0 评论