摘要:
http://poj.org/problem?id=2479 方法:两次dp+一次扫描,复杂度3*n 基于求最大连续子数组的线性dp算法 对数组从前往后各做一次O(n)的dp,求得maxsofar[0][0...n-1],再数组从后往前各做一次O(n)的dp,求得maxsofar[1][0...n-1], 再扫描一遍maxsofar求得maxsofar[0][i-1] + maxs... 阅读全文
摘要:
http://poj.org/problem?id=2388 方法: 找中位数 一般来讲当数不是很多时可使用patition的方法,复杂度n 这里的方法适用于大量数据的情况,此时内存无法放下所有数。通过扫描大概lgn次数据即可找到中位数,复杂度nlgn 利用了中位数的性质:其左右两边的数据量相同 Description FJ is survey... 阅读全文
摘要:
http://poj.org/problem?id=2352 方法:复杂度N*O(log Max) 树状数组Binary Indexed Tree,具体见3321 求得常变二维平面上(0,0)到(x,y)所形成的矩形中点的个数 由于内存限制,所以只能考虑用一维的BIT来解决此问题。因此需要将输入数据先按y排序,再对 同y的x排序,对这样排序好的数据依次进行处理... 阅读全文
摘要:
http://poj.org/problem?id=2299 方法: 利用merge sort求逆序数,复杂度nlgn 如果比较每一对儿数(或使用bubble sort),复杂度为n^2,太慢 对于一对儿逆序对儿,有三种情况:两数都在数组左半边,两数都在数组右半边,两数分别在左右两个半边。 由于Merge时两个半边都为sorted,所以只会出现第三种情况。 计算... 阅读全文
摘要:
http://poj.org/problem?id=2262 方法: 首先筛得1000000以下的素数表,复杂度N*lglgN 再用测试值减去素数表中从小到大的值,判断如果该值是素数,则不需要再接着找了,直接输出。复杂度N 注意点: 1、由于N很大,所以筛素数在计算i*i时可能会超过int的范围,所以需要采用__int64 2、需要符合要求的a,b使得a+b=c的... 阅读全文
摘要:
http://poj.org/problem?id=2255 方法: 根据preorder和inorder构造postorder 例如preorder:DBACEGF inorder:ABCDEFG ... 阅读全文
摘要:
http://poj.org/problem?id=2159 题意万岁:判断两数组a、b中的所有数是否一样(一个数组是另一个数组的排列) 两种方法: 1、可以先排序再依次判断两数组元素,复杂度nlgn+n 2、由于此题中每个字符串的长度最大为100,则数组中的每个元素都不会超过100,那么... 阅读全文
摘要:
http://poj.org/problem?id=2155 题目要求修改一个区域,然后求一个元素的值。貌似和树状数组的功能完全相反。但这题,应该 说这个思路的精妙之处就体现在这里。我认为关键是要理解“树状”的概念。画一个一维的树状数 组图形,就会发现所有的元素都会链接到2,4,8,16,32……这条“主干”上来。那么,修改了“主干”, 其实就相当于修改了整个“树... 阅读全文
摘要:
http://poj.org/problem?id=2104 方法: 1、划分树,是平衡树:数组排序nlgn,建树nlgn,m次查询mlgn,总复杂度为O(nlgn+mlgn) 划分树就是利用类似线段树的树型结构记录划分元素(最终排序)的过程。 划分树是一种树形结构的二维数组,由四个... 阅读全文
摘要:
http://poj.org/problem?id=1611 方法: 由于需要求得0元素所在划分的元素数,所以采用union by size的方法 将所有等价元素union到一起,然后再输出0元素所在划分的元素数 注意: union时需要事先判定两元素是否已经在同一个划分中,不然会出错 Description Severe acute respiratory syndrome (... 阅读全文
摘要:
http://poj.org/problem?id=1606 方法: 该题简化之后即为求从初始状态(0,0)到终止状态(i,C)的最短路径 对于每个状态(i,j)存在由6种操作得到的6个邻接状态,即为图中的邻接节点 将每种操作和得到的节点状态对应上以便打印路径,即pathArr[6]和adjVertex[6] 注意: 此题的input无终止条件,所以一定要在scanf后面加上!=E... 阅读全文
摘要:
http://poj.org/problem?id=1503 方法: 很简单,模拟手动加法过程, 结果中的前置0要消去 Description One of the first users of BIT's new supercomputer was Chip Diller. He extended his exploration of pow... 阅读全文
摘要:
http://poj.org/problem?id=1426 方法: 找到n的倍数m,m中只能有0或1 0,1可构造出二叉树进行BFS搜索 该题的重点就在于如何构造出BFS进行搜索。 所有0,1组成的数可以构造出一颗二叉树从而进行BFS。每层的数字长度相同,每个节点的左右孩子为其末尾分别添加0,1 BFS搜索一颗二叉树。二叉树的节点按层序遍历依次为(1),(10,11),(100,... 阅读全文
摘要:
http://poj.org/problem?id=1308 方法: 给定一些节点和对应边,判断他们所形成的图是否是树 技巧:类似于“并查集”的表示方法来表示树的结构 tree[1...49]初始为0。tree[i]表示i的父节点。 isNode[1...49]记录哪些编号的节点出现在图中 依次读入父节点p、子节点c和对应边,将isNode[p]和isNode[c]置位1,并赋值... 阅读全文
摘要:
http://poj.org/problem?id=1195 方法: 简单的2D树状数组的应用 树状数组BIT形状很像二项树,适用于对经常改变的数组快速求得区间和。 采用树状数组tree[N]的话,每次调整与求和的复杂度为O(logN),效率大大提高。 介绍BIT的好文 http://www.topcoder.com/tc?module=Static&... 阅读全文
摘要:
http://poj.org/problem?id=1163 方法: DP:将大问题转化为小问题解决。由递归写循环。 c[i][j]表示从a[1][1]开始到a[i][j]的最大和。而最终的结果为c[n][1...n]中的最大值 递归式为: c[1][1] = a[1][1] c[i][j] = max{ c[i-1][j-1], c[i-1][j] } + a[... 阅读全文
摘要:
http://poj.org/problem?id=1159 方法1: c[i][j]表示:s[i...j]子字符串中最少需要插入多少个字符形成回文 c[1][n]为最终结果 初始值: c[i][i] = 0 c[i][j] = 0,if i>j 递归式: c[i][j] = c[i+1][j-1],if s[i]==s[j] ... 阅读全文
摘要:
http://poj.org/problem?id=1157 方法: c[i][j]:一共i束花,j个花瓶时的最大值。 初始化: c[1][1] = a[1][1] c[i][i] = c[i-1][i-1]+a[i][i] 递归式: c[i][j] = max{ c[i][j-1], c[i-1][j-1]+a[i][j] } Descri... 阅读全文
摘要:
http://poj.org/problem?id=1007 求逆序数的方法: 1、此题每个string只有4种字母,所以可以用类似counting sort的方法来以逆序扫描字符串,并以a[1...3]记录相应字符串组的个数,计算每位数与其后面几位的逆序数。复杂度n。但输入若没有限制就不能靠a[1...3]这样做了,那样的话可能每扫描一个字符++的数组位很多,需要判断的分支也很多... 阅读全文