07 2011 档案

poj-2313 Sequence ***
摘要:/* * 贪心: * 但自己没想出来, 看了网上的解法。。似乎也不太懂。 。 网上给的解法倒是可以证明是对的,但不知道是怎么想的 * 先给网上的解法: * //开始假设b[i] = a[i](1 <= i <= n) * //显然b[i]对于最后最优值产生影响的有三项|a[i]-b[i]|,|b[i]-b[i-1]|,|b[i]-b[i+1]| * //反应在数轴上要使得这三项最小,那么取值应该是这三数居中的那个 * //若存在i使 b[i] < 或者 > Mid(b[i - 1], a[i], b[i + 1]) (2 <= i <= n - 1) * / 阅读全文

posted @ 2011-07-30 20:12 龙豆 阅读(500) 评论(0) 推荐(0) 编辑

poj-2325 Persistent Numbers ****
摘要:/* * 简略版大整数除法 + 贪心 * 不难发现,如果输入的数含有大于等于10的质数因子,则无解,所以 * ,只需要把输入的数分解为2,3,5,7的幂的形式,然后再由低位向 * 高位进行分配即可(越低位的数字,其值尽可能大) * * 开始没好好分析,结果认为 只要 从高位向低位枚举,且满足( ans[i+1] >= ans[i] && ans[i+1]*ans[i] >= 10 )即可, * 每次枚举一个,就将原数除这个数。。。一次递归求每一位数。 只要求出了一个答案,则答案就是这个。。 * 后来发现这个方法是不行的。。 比如:54454680 找到的答案是:25 阅读全文

posted @ 2011-07-30 17:05 龙豆 阅读(706) 评论(0) 推荐(0) 编辑

poj-1505 Copying Books ***
摘要:/* * DP * d[i][j] : 前i个人,分完1~j本书,d值满足:minimize the maximum number of pages assigned to a single scriber * d[k][m]即为所求 * * 状态转移方程:d[i][j] = min( max(d[i-1][t] , page[j] - page[t]) ) 其中: i-1 <= t <= j-1 (注意每个人至少一本书) * 其中 page[i] 为 1~i本书的总页数, page[j]-page[t] 即为第j个人分到的页数 * * 最后注意满足 “If there is mo 阅读全文

posted @ 2011-07-28 17:56 龙豆 阅读(478) 评论(0) 推荐(1) 编辑

算法导论-9.3-7
摘要:【转】题目:给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k<=n后,它能确定出S中最接近其中位数的k个数。——————————算法思想:1.找到数组a中第n/2小的数median;2.对a中非median数进行|a[i] - median|,得到一个大小为n - 1的数组distance;3.寻找distance中第k小的数值;4.对distance进行一次遍历,找到小于等于k的数,从而对应得到数组a中的k个数。上述每一步的时间复杂度都为O(n),因而最后总的时间复杂度为O(n).#include <iostream>#include <t 阅读全文

posted @ 2011-07-28 12:06 龙豆 阅读(384) 评论(0) 推荐(0) 编辑

poj-1042 Gone Fishing **
摘要:/* 贪心+优先级队列 * * 贪心:为了不讨论在路上花费的时间,可以枚举到过的湖:比如:totLake=j 表示 到过湖1、2、..、j 相应的, 花在路上的时间 * 就是 t[1]+t[2]+..+t[j-1] (显然每段路只会走一次) 于是算出leftTime,表示花在钓鱼上的时间 * 这样一来,就不同再考虑路上的时间了,可以认为John有瞬间移动,哪个湖鱼多,就到哪个湖钓(当然 湖的编号 满足 1 <= ~ <=totLake ) * * 于是可以用一个优先级队列,每次到与最多的湖钓, * 还要注意的是,如果某时刻有多个湖有同样多的鱼,则到湖编号最小的那个湖里钓!!(只要对 阅读全文

posted @ 2011-07-27 22:33 龙豆 阅读(1013) 评论(0) 推荐(0) 编辑

算法导论-15-7 达到最高效益的调度
摘要:【转】问题:假设有一台机器,以及在此机器上处理的n个作业a1,a2,...an的集合。每隔作业aj有一个处理时间tj,效益pj,以及最后期限dj。机器在一个时刻只能处理一个作业,而且作业aj必须在tj连续时间单位内不间断地运行。如果作业aj在最后期限dj之前完成,则获得效益pj,但如果在最后期限之后才完成,则没有效益。请给出一个动态规划算法,来寻找能获得最大量效益的调度,假设所有的处理时间都是1到n之间的整数。——————————分析:其实这个问题类似于01背包问题。1. 将a1,a2,…,an按照dj值排序,从小到大。假设接下来的分析中,已经保证当i<j时,di<dj。添加d0= 阅读全文

posted @ 2011-07-27 10:45 龙豆 阅读(3565) 评论(2) 推荐(0) 编辑

算法导论-15.5-4
摘要:Exercises 15.5-4 Knuth has shown that there are always roots of optimal subtrees such that root[i,j-1]<=root[i,j]<=root[i+1,j] for all 1<=i<=n. Use this fact to modify the OPTIMAL-BST procedure to run in Θ(n^2) time.—————————————————————————————————————————————————— First prove this fact 阅读全文

posted @ 2011-07-27 09:36 龙豆 阅读(1465) 评论(0) 推荐(0) 编辑

红黑树实现
摘要:/* * RED-BLACK-TREE * */#include <cstdio>using namespace std;const int MAXN = 10000;const int RED = 0, BLACK = 1, ROOT = 0;struct SData{ int key, color; SData *left, *right, *p;};SData *rbtree[MAXN];SData *nil = new SData;void ini(){ nil->color = BLACK; rbtree[ROOT] = nil;}SData *rb_minimum 阅读全文

posted @ 2011-07-21 21:37 龙豆 阅读(520) 评论(0) 推荐(1) 编辑

poj-3349 Snowflake Snow Snowflakes *
摘要:/* * hash。。 链表法 * 3349.cpp * * 需注意如何判断两个雪花一样 * 看数据: * 1 1 2 0 0 0 * 1 1 0 0 0 2 * * Created on: 2011-7-21 * Author: */#include <cstdio>using namespace std;const int MAXN = 100000 + 5;int n;bool vis[MAXN] = {};struct SData{ int a[6]; SData *pre, *next;};SData *table[MAXN];SData snow[MAXN];//相加 阅读全文

posted @ 2011-07-21 18:14 龙豆 阅读(320) 评论(0) 推荐(0) 编辑

poj-2418 Hardwood Species *
摘要:/* * 二叉查找树练习 * 2418.cpp * * Created on: 2011-7-21 * Author: */#include <cstdio>#include <cstring>using namespace std;const int maxs = 10000 + 5;const int ROOT = 0;struct SData{ char name[35]; int num; SData *left, *right; SData(): num(0), left(NULL), right(NULL) {}};SData *tree[maxs];int 阅读全文

posted @ 2011-07-21 17:07 龙豆 阅读(312) 评论(0) 推荐(0) 编辑

Splay树简介
摘要:【转】计算机算法和数据结构中,有各种多样的树,比如AVL树,红黑树,B+树等等,这几种树主要的主要目的是尽量保持平衡,保证即使在最坏情况下,时间复杂度是O(logN),也就是说,从根节点到最底层的叶子节点,路径不会相差太远。比如B+树,它通过节点的分裂来保持尽量平衡,而且这种树比较散,高度不高,访问路径都比较短,比较适合在数据库中作索引。但是今天我要说一说splay树,我不知道中文叫什么名字,也许该叫它“变根树”。Splay树与众不同的是:它并不一味追求平衡,而是追求整体的效率。当一个节点被访问以后,通过树的旋转,这个节点被移动到最上层,成为新的根节点。旋转以后,这棵树有可能变得很不平衡。但是 阅读全文

posted @ 2011-07-20 21:24 龙豆 阅读(1852) 评论(0) 推荐(1) 编辑

AVL树
摘要:ZhangFei 12.00 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 【转】数据结构学习(C++)——平衡二叉树(AVL树)这个恐怕是整个《数据结构》教科书里面最难的和最“没用”的数据结构了(现在的教科书还有部分算法内容)。说它没用,恰恰是因为它太有用——有着和普通的二 叉搜索树完全一样的接口界面,绝大多数情况下比普通的二叉搜索树效率高(很多)。因此,通常情况下,人们都是一劳永逸的——写完后就重用,而不会再写了。 所以说,你虽然学完了平衡二叉树,但很可能你永远也不会亲. 阅读全文

posted @ 2011-07-20 20:59 龙豆 阅读(1390) 评论(0) 推荐(1) 编辑

红黑树(red-black tree)算法,附AVL树的比较
摘要:【转】【经典】导读: linux内核中的用户态地址空间管理使用了红黑树(red-black tree)这种数据结构,我想一定有许多人在这种数据结构上感到困惑,我也曾经为此查阅了许多资料以便了解红黑树的原理。最近我在一个外国网站上看到一篇讲解红黑树的文章,觉得相当不错,不敢独享,于是翻译成中文供所有内核版的弟兄们参考。由于本人水平有限,难免有出错之处,欢迎大家指正。 原文网址:http://sage.mc.yu.edu/kbeen/teaching/algorithms/resources/red-black-tree.html 加两个链结地址: 红黑树的实地使用 http://www.linu 阅读全文

posted @ 2011-07-20 20:55 龙豆 阅读(7520) 评论(0) 推荐(0) 编辑

算法导论-14.1-8
摘要:【题目】现有一个圆上的n条铉,每条铉都是按其端点来定义的。请给出一个能在O(n log n)的算法,确定圆内相交铉的对数(例如:如果n条铉都是直径,他们交于圆心,则正确的答案为C(n,2),组合数)。另外任意两条铉没有公共点。【解答】[转] 通过角度来判断两条弦是否相交,这样可以在O(n*logn)内完成。 对于两条弦P1P2和Q1Q2来说(顺时针),圆心与端点形成的向量有一个角度A 如果A(P1)<A(Q1)<A(P2)<A(Q2)或者A(Q1)<A(P1)<A(Q2)<A(P2),这样角度区间“交叉”就意味着两条弦有交叉。 通过角度来统计交叉弦的对数,和 阅读全文

posted @ 2011-07-20 16:31 龙豆 阅读(884) 评论(0) 推荐(1) 编辑

算法导论-13.2-4
摘要:Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 【转】首先证明任意的二分查找树可通过至多n-1次旋转变成右行链: 从根开始,反复对根节点执行right-rotate直到根的左子树中的节点都处于根的右行链中;沿着右行链遍历,找到原来树中根节点的右儿子,遍历过程中对每个节点执行right-rotate操作直到该节点没有左子树;对原来根的右孩子执行同样的操作,反复进行right-rotate操作;所有可能的right-rotate有n-1个由对称性可知右行链可通过至多n-1次旋转变. 阅读全文

posted @ 2011-07-18 22:02 龙豆 阅读(585) 评论(0) 推荐(0) 编辑

poj-1856 Sea Battle *
摘要:/* * bfs * 又是一道水题。。1A * */#include <cstdio>#include <cstring>using namespace std;const int MAXN = 1000 + 5;int r, c; //同题意bool vis[MAXN][MAXN];char map[MAXN][MAXN];// sx,sy:矩形左上角。。ex,ey:矩形右下角..tot:矩形数。。。flag:是否正确int sx, sy, ex, ey, tot, flag;//获得ex,ey.. 若不是矩形,返回falsebool inline get_cor(i 阅读全文

posted @ 2011-07-16 21:06 龙豆 阅读(325) 评论(0) 推荐(0) 编辑

非递归遍历二叉树[转]
摘要:【转】http://blog.csdn.net/kofsky/article/details/28864531.先序遍历从递归说起voidpreOrder(TNode*root){if(root!=NULL){Visit(root);preOrder(root->left);preOrder(root->right);}}递归算法非常的简单。先访问跟节点,然后访问左节点,再访问右节点。如果不用递归,那该怎么做呢?仔细看一下递归程序,就会发现,其实每次都是走树的左分支(left),直到左子树为空,然后开始从递归的最深处返回,然后开始恢复递归现场,访问右子树。其实过程很简单:一直往左走 阅读全文

posted @ 2011-07-16 19:43 龙豆 阅读(586) 评论(0) 推荐(0) 编辑

算法导论-7-6 对区间的模糊排序
摘要:【转】《算法导论》chapter7 problem7-6对区间的模糊排序考虑这样一种排序问题,即无法准确的知道等排序的各个数字到底是多大.对于其中的每个数字,我们只知道它落在实轴上的某个区间内.亦即,给定的 n 个形如[ai, bi ]的闭区间,其中ai,≤bi .算法的目标是对这些区间进行模糊排序(fuzzy-sort),亦即,产生各区间的一个排序<i1, i2, i3, i4,…in >,使得存在一个 cj ∈[ai, bi ],满足c1≤c2≤…≤cn .a)为n个区间的模糊排序设计一个算法,你的算法应该具有算法的一般结构,它可以快速排序左部端点(即各ai ),也要能充分利用 阅读全文

posted @ 2011-07-15 22:20 龙豆 阅读(1981) 评论(0) 推荐(1) 编辑

算法导论-5.1-2
摘要:【转】描述random(a, b)过程的一种实现,它只调用random(0,1)。作为a和b的函数,你的程序期望运行时间是多少?这个题目相当于在能随机生成0,1的前提下,要求生成[0, 1, ...,n-1]范围内的一个整数1 求出最小的 m,使2^m >= n-12 通过random(0,1),产生一个m比特的整数,这样能随机产生[0, 2^m-1]内的整数,若产生的整数位于[0, n-1]内,则取这个数作为结果。如果这个数在[0,n-1]外,则丢弃它,再次运行算法重新生成一个。 a) 证明上述算法可以产生 [0, n-1]范围内的随机数在范围[0,1, ..., n-1, n, .. 阅读全文

posted @ 2011-07-15 21:57 龙豆 阅读(933) 评论(0) 推荐(0) 编辑

poj-1980 Unit Fraction Partition **
摘要:/* * 本以为这题剪枝会很难,没想到1A了。。32ms * 这个题的难点是分数的处理。。不要用double。。精度难以把握。。 * */#include <cstdio>#include <cmath>using namespace std;int p, q, a, n, tot; //如题目定义,tot为答案//p1/q1 和 p2/q2 比较大小int inline frac_cmp(int p1, int q1, int p2, int q2){ return p1 * q2 - p2 * q1;}/*int inline gcd(int a, int b){ 阅读全文

posted @ 2011-07-15 21:22 龙豆 阅读(951) 评论(0) 推荐(1) 编辑

算法导论-4-6 VLSI芯片测试
摘要:【转】问题:Diogenes 教授有n个被认为是完全相同的VLSI芯片,原则上它们是可以互相测试的.教授的测试装置一次可测试二片,当该装置中放有两片芯片时,每一片就对另一片作测试并报告其好坏.一个好的芯片总能够正确的报告另一片的好坏,但一个坏的芯片的结果就是不可靠的.这样,每次的测试的四种可能结果如下: a)证明若少于 n/2 的芯片是坏的,在这种成对测试方式下,使用任何策略都不能确定哪个芯片是好的.b)假设有多于 n/2 的芯片是好的,考虑从 n 片中找出一片好芯片的问题.证明 n/2 对测试就足以使问题的规模降至近原来的一半.c)假设有多于 n/2 的芯片是好的,证明好的芯片可用 O(n) 阅读全文

posted @ 2011-07-15 19:32 龙豆 阅读(2792) 评论(0) 推荐(0) 编辑

算法导论-4-2 找出所缺的整数
摘要:【转】 问题: 某数组A[1..n]含有所有从0..n的所有整数,但其中有一个整数不在数组中,通过利用一个辅助数组B[0..n]来记录A中出现的整数,很容易在O(n)时间内找出所缺的整数。但在这个问题中,我们却不能由一个单一操作来访问A中的一个完整整数,因为A中元素是以二进制表示的。我们所能用的唯一操作就是“取A[i]的第j位”这个操作所花时间为常数。证明:如果访问数组A中信息的唯一方式是这种单一位操作,仍能在O(n)时间内找出所缺的整数。A之外的任一完整整数仍然可以由一个单一操作来访问。【算法导论 中文版P504-2】 昨天晚上看算法导论看到了这一题,没有想多久,没想通。当时想的是把A中的每 阅读全文

posted @ 2011-07-15 19:19 龙豆 阅读(2325) 评论(1) 推荐(1) 编辑

poj-1190 生日蛋糕 **
摘要:/* * dfs+剪枝 * 注意到:N = (ri * ri * hi)求和 * S = r1 * r1 + (2*ri*hi)求和 (水平面面积之和第一层的半径有关) * */#include <cstdio>#include <cmath>using namespace std;const int INF = 10000000;const int MAXM = 20 + 5;int n, m, s;//可以使剪枝更加精确。。 79ms->63msint min_v[MAXM];int min_s[MAXM];void build(){ min_v[m] = 1 阅读全文

posted @ 2011-07-14 22:27 龙豆 阅读(471) 评论(0) 推荐(0) 编辑

poj-1874 Trade on Verweggistan *
摘要:/*排序..水。。 * * WA的话试试以下2租数据 * 1 * 2 11 16 * 2 * 2 11 16 * 2 1 3 * 输出应该是 * Workyards 1 * Maximum profit is 0. * Number of pruls to buy: 0 * * Workyards 2 * Maximum profit is 16. * Number of pruls to buy: 2 * 要注意最大利润小于0时的情况,最大利润小于0时,商人是不会买该堆的物品,即此时该堆最大的利润应该是0,而不是所求得的那个负数。 * */#include <cstdio>#in 阅读全文

posted @ 2011-07-14 19:57 龙豆 阅读(423) 评论(0) 推荐(0) 编辑

poj-3321 Apple Tree ****
摘要:/* 看了网上的代码。。再自己写了一个。。。( 网上很多代码都是默认输入的数据u是v的父节点。。 也能AC。。 但不严谨。。)【转】思路:树状数组。这道题重点怎么建立树到树状数组的映射关系:利用dfs遍历树,对每个节点进行两次编号,第一次搜到第i个节点时的深度dep,为这个节点管辖区间的上限low[i](也为这个节点的下标),然后搜这个节点的子节点,最后搜回来后的深度dep,为这个节点管辖区间的下限high[i]。接下来就是树状数组部分了。*//* * 3321 * 邻接表建树+树状数组 * */#include <cstdio>using namespace std;const 阅读全文

posted @ 2011-07-11 21:43 龙豆 阅读(334) 评论(0) 推荐(0) 编辑

poj-1195 Mobile phones *
摘要:/* 难得的1A题~~ 标准的树状数组 * 1195.cpp * 注意坐标从0开始, 应处理成从1开始 * Created on: 2011-7-11 * Author: */#include <cstdio>using namespace std;const int MAXS = 1024 + 5;int map[MAXS][MAXS] = {};int c[MAXS][MAXS] = {};int s, x, y , a, l, r, b, t, cmd; //题目中的参数int lowbit(int x){ return x & (-x);}void update(i 阅读全文

posted @ 2011-07-11 15:37 龙豆 阅读(268) 评论(0) 推荐(0) 编辑

poj-2777 Count Color *
摘要://蛮水的线段树//2777//用scanf() 用位运算#include <cstdio>#include <cstring>using namespace std;const int MAXL = 100000 + 5;const int MAXT = 30 + 5;int L, T, O, a, b, c, ans;bool vis[MAXT * 3];char cmd;struct node{ int l, r; int c;};node tree[MAXL * 3];void build(int i, int l, int r){ tree[i].l = l; 阅读全文

posted @ 2011-07-11 15:06 龙豆 阅读(252) 评论(0) 推荐(0) 编辑

poj-2828 Buy Tickets ***
摘要:线段树//2828View Code /* * [这段话转的。。] * 如果我们从头开始一次做的话,无论是用链表还是数组,肯定会超时(链表寻址时间长,数组移位时间长。)。 * 所以要用一个快速的方法直接找到位置。但是换个角 度,如果我们反过来排,那样的话,我们就知道他所在的 * 精确位置!把存储的结构想象成是链表,插队的人插入后,把他所在的位置从链表中屏蔽掉,然后在新的链 表种 * 继续这样存,这样的话我们就得到了我们想要的顺序! * * 按照这种思想,可以用线段树实现。。。 * */#include <cstdio>using namespace std;const int MA 阅读全文

posted @ 2011-07-10 16:41 龙豆 阅读(463) 评论(0) 推荐(0) 编辑

poj-2528 Mayor's posters
摘要:离散化 + 线段树坐标按从小到大排序,再构造映射。。View Code 1 //color=0表示未着色或为杂色 2 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 const int MAXN = 40000 + 5; 9 const int MAX_R = 10000000 + 5; 10 11 int n, ans; 12 bool vis[MAXN] = {}; 13 struct SData{ //记录数据 14 i 阅读全文

posted @ 2011-07-10 14:06 龙豆 阅读(248) 评论(0) 推荐(0) 编辑

poj-3034 Whac-a-Mole
摘要:dp先自己写了一个。。 n次WA后搞成TLE~ 。。。 忍无可忍。。 后来参考了网上的代码。 最终AC~先贴人家的代码吧~【转】思路:DP。改了要一天,很纠结的一道题。DP部分,dp[t][x][y]表示第t时间把锤子停在(x,y)上最多能够打到的地鼠数量。则dp[t][x][y]= max(dp[t-1][xx][yy]+ (xx,yy)到点(x,y)新打的地鼠数),(xx,yy)和(x,y)的直线距离<d。但是最主要的是下面两点:1:中转点可能在区域外,如下数据: //相当重要!!!20 5 41 0 10 1 10 5 21 6 2答案应该是4而不是3,这就需要扩展区域为n+2d就 阅读全文

posted @ 2011-07-09 16:52 龙豆 阅读(608) 评论(0) 推荐(0) 编辑

poj-1925 Spiderman
摘要:dpd[i] 表示从apartment到 横坐标 i 最少需跳几步。。 p[i] 建筑物 i 的横坐标, h[i]建筑物i的纵坐标注意 由对称性,spiderman的纵坐标始终是 apartment 的高度!! 所以不需要管纵坐标!!遍历每个建筑物。。 从横坐标 j 能跳过建筑物 i 需满足: (p[i] - j)^2 <= h[i] ^ 2 - (h[i] - h[1]) ^2 从横坐标 j 经建筑物 i 后 到达横坐标 2 * p[i] - j。。 综上, d[2 * p[i] - j] = min(d[2 * p[i] - j] , d[j] + 1)...最后注意到达west t 阅读全文

posted @ 2011-07-08 22:09 龙豆 阅读(813) 评论(0) 推荐(0) 编辑

poj-2948 Martian Mining
摘要:dpdp[i][j]表示(1,1)-(i,j)小矩阵的最大收获,可以轻松得到dp方程:dp[i][j] = max( dp[i][j-1] + col[j][i], dp[i-1][j] + row[i][j]);其中row[i][j]表示第i行从第0列到j列的和,col[i][j]表示第i列从第0行到j行的和。#include <cstdio>#include <cstring>using namespace std;const int MAXN = 500 + 5;int n, m;int data_x[MAXN][MAXN];int data_y[MAXN][MA 阅读全文

posted @ 2011-07-07 21:09 龙豆 阅读(293) 评论(0) 推荐(0) 编辑

poj-1656 Counting Black
摘要:可用暴力法~下面用二维树状数组:/** 1656.cpp** Created on: 2011-7-6* Author: **/#include <iostream>#include <string>using namespace std;const int MAXN = 100 + 5;const int W = 0, B = 1;int map[MAXN][MAXN] = {};int c[MAXN][MAXN] = {};int t, x, y, l;string cmd;int lowbit(int _x){ return _x & (-_x);}voi 阅读全文

posted @ 2011-07-06 23:09 龙豆 阅读(241) 评论(0) 推荐(0) 编辑

poj-2029 Get Many Persimmon Trees
摘要:my code:/** 2029.cpp** Created on: 2011-7-6* Author: */#include <iostream>#include <cstring>using namespace std;const int MAXN = 100 + 5;bool tree[MAXN][MAXN] = {}; //坐标上是否有树int d[MAXN][MAXN] = {}; //一维矩阵上的树的总数(坐标表示1*1元)int ans[MAXN][MAXN] = {}; //s * t 矩阵上的树的总数(坐标表示1*1元)int imax = -1;in 阅读全文

posted @ 2011-07-06 18:35 龙豆 阅读(188) 评论(0) 推荐(0) 编辑

树状数组[转]
摘要:先看比较基础的讲解:【转】今天先来讨论一下树状数组.问题提出:已知数组a[],元素个数为n,现在更改a中的元素,要求得新的a数组中i到j区间内的和(1<=i<=j<=n).思考:对于这个问题,我们可以暴力地来解决,从a[i]一直累加到a[j],最坏的情况下复杂度为O(n),对于m次change&querry,合起来的复杂度为O(m*n),在n或m很大的情况下,这样的复杂度是让人无法忍受的.另外,如果没有元素的变更,我们完全可以存储sum[1,k](k=1,2,……),然后对任意给定的查找区间[i,j],都可以方便的用ans=sum[1,j]-sum[1,i-1],当然 阅读全文

posted @ 2011-07-06 18:28 龙豆 阅读(319) 评论(0) 推荐(0) 编辑

poj-3280 Cheapest Palindrome[转]
摘要:这个dp题可以算是很顺利的一题,虽说之前看了看就觉得很难没管它,但是今天真的不一样,开始其实思路还有点乱麻,只过了几分钟我忽然间就理清了思 路,得到了一个dp子问题,可能还要归功于之前做了一题叫括号匹配的类似dp给了我灵感,真的构造出来和没有构造出前的差别很大啊!同学们!相信自己的实力吧!但是要自信加合理推导才能得出信服的答案!其实dp很难逃出3种思路:1、一维线性dp:每次考虑i时,选择最优子问题要么在i-1,要么在1...i-1里;2、二维线性dp:考虑(i,j)子问题时,选择最优子问题要么在(i+1,j)、(i,j-1),要么在i<= k <=j,在k里;3、树形dp:考虑i 阅读全文

posted @ 2011-07-06 10:30 龙豆 阅读(582) 评论(0) 推荐(0) 编辑

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示