|
|
|
|
|
|
08 2012 档案
poj 2528 Mayor's posters(线段树+离散化)
摘要:http://poj.org/problem?id=2528(1)给定一条线段,依次在上面覆盖一些线段(左右位置已给定),求最终能看到的线段数(看到一部分也算)。 本题的本质和染色问题一样,成段染色,延迟更新。(2)有一个难点在于,所给定的区域是1到1000万,不可能开这么大的数组。况且,用于覆盖的线段只有1万条。 这里用到了离散化方法,简化了问题,压缩了数组的大小(具体情况见代码)。(3)傻到开了一个pos[]数组,准备用来表示谁映射到谁。。(很无语,当时没有注意pos[]数组要开到1000万这么大)。(4)在写travel()函数时,忘了加上pushdown()。(5)思路点拨: 1...
阅读全文
浙大月赛C题(2012/8)Cinema in Akiba(线段树)
摘要:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=4791(1)第一次写浙大的题目,这题让我十分意外,基本的线段树类型(求第x个空位)。(2)电影院里,一次插入一个人,让他坐在第x个空位shang(每个x均给定)。求最终的位置安排(制定一些人,求他们各自的座号)。具体代码:View Code #include<stdio.h>#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn=51000;int
阅读全文
hdu 1698 Just a Hook (线段树,延迟操作)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1698(1)简单的延迟操作。具体代码:View Code #include<stdio.h>#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn=101000;int t, n, m;int mark[maxn<<2], sum[maxn<<2];void pushdown(int rt, int n){ if(mark[rt]) { mark[rt<<1]=
阅读全文
hdu 2852 KiKi's K-Number (线段树,求大于x的第k小数)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2852(1)求比x大的第k个最小值。问题可以分解为两个子问题: 1)求不大于x 的数的个数t。(本质为求和) 2)求树里头的第t+y个数的值。(本质为定位)(2)考虑过直接计算出结果:search(y, x, n, 1); 即在区间(x, n)中寻找第y个数。 这种思想是可行的,但不适合已经构建的这棵树。因为已有的线段树只能从区间(1, 某数)开始查询,区间(x, n)与sum[]数组的描述方式对不上号。 (原有的sum[]数组中可能不含描述区间(x, n)的sum[i],并且一般情况下就是不包含对...
阅读全文
hdu 2711 Lost Cows(线段树,反序更新)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2711(1)又是一道从后往前更新的题目,该算法确实经典。(2)新亮点:用到了变量pos求ans[i];另外,用search()函数单独处理ans[1]。具体代码:View Code #include<stdio.h>#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn=81000;int n;int data[maxn], sum[maxn<<2];int ans[maxn];voi
阅读全文
hdu 1556 Color the ball (线段树,延迟更新)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1556(1)延迟更新:pushdown()函数,记得在所有的查询、更新函数中都要使用到。这里用到懒惰标记mark[]数组。(2)很基础的题,1A。具体代码:View Code #include<stdio.h>#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn=101000;int n;int mark[maxn<<2], sum[maxn<<2];void pushd
阅读全文
hdu 3564 Another LIS (线段树sum+二分查找)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3564(1)和今天刚做过的一道题十分相似(夜间插队问题hdu2828),从后面起算,因为最后面的数的位置是固定的,而其他数的位置被其后面的树影响着。(2)一个易错点,在insert()函数中:if(p<=sum[rt<<1]) insert(p, val, lson);else insert(p-sum[rt<<1], val, rson); 注意每个字段的含义(sum[]数组是空位的个数,p是需要预留的空位数),很多时候不加思考,就写错成了: if(p<=m) inser
阅读全文
poj 2923 (Relocation)(状态压缩dp)
摘要:http://poj.org/problem?id=2923(1)2辆车搬运n件家具,求最少的搬运次数。背包问题的一般思路是,把物品顺次装入背包,不过背包有且仅有一个。然而,这里的“背包”,不仅有两个, (2辆车),而且“背包”还可以重复使用。。。这种情况下,就不能简单地讲车看做背包,而应该另辟新径。(2)用到状态压缩(将每种状态用一个整数 x 的二进制形式来表示),先确定所有的状态下哪些情况能够一次运完,做好标记。在初始化dp数组为无穷大后 (dp[0]=0),遍历每种一次可以运完的情况,看看是否可以用它来更新其他状况的dp:if(!(j&re[i])) dp[j|re[i]]=..
阅读全文
poj 2486 Apple Tree(树形dp+背包+dfs)(*****)
摘要:http://poj.org/problem?id=2486(1)本题属于只是交叉的题目,核心思想在于递归(状态转移方程的写出),假如要求得 p 点的信息,则可以通过其所有的相邻的点 now 的信息来更新。 而 now 的信息可以由未访问且与它相邻的点的信息来更新。(2)由于是树状结构,访问时可能会折回某一个点,然后去另一条支路上,所以走 K 步有返回起点和不返回起点两种形式。(3)最核心的算法本质:dp[0][g][i+j+2]=max(dp[0][g][i+j+2], dp[0][g][i]+dp[0][now][j]);dp[1][g][i+j+1]=max(dp[1][g][i+j+1
阅读全文
poj 2828 Buy Tickets (线段树sum)
摘要:http://poj.org/problem?id=2828(1)注意到,最后插队的人的位置是一定的,前一个人的位置的最终稳定取决于后面的所有人。为了避免插入一个新数时要挪出位置的尴尬,更为效率考虑, 可以从后往前插入树中(注意谁决定谁的关系的使用)。(2)小细节: 1) 0~n-1 而不是 1~n; 2)先输入,再更新(分开来); 3)希望今后的小错误可以尽快找出,线段树的写法虽然懂,但小错误最伤不起(很幼稚的类型,却很长时间才发现); 4)几乎所有的线段树都是求和、最值,但是各种包装下没能看清本质,还要多练手(题库里还有大约40题)。(3)对于每个插队的人(倒着数)...
阅读全文
hdu 4027 Can you answer these queries? (线段树+__int64)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4027又是纯粹的线段树的基本操作。(1)数组data[]是纯是浪费,不用开。数组sum[]在 build() 函数下应保证初始化成功(尤其是指先赋值为0,在读入数据)。(2)if(b>c) {int x=b;b=c;c=x;} 这关乎AC与否的问题。(3)稍微注意__int64 。(4)本题不需要成段更新(也没办法成段更新),更新时肯定会比较耗时。这里有个优化,当所考虑的区间里德只全为1(sum==r-l+1),就不需要更新了。if(sum[rt]==r-l+1) return ;具体代码:View C
阅读全文
hdu 2795 Billboard (线段树)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2795(1)用到了线段树求最大值。线段树求最值、求和是两种重要工具,很多题目要以此为基石(很多时候第一眼看不出来要用上他们)。 本题的本质为求一段区间的最大值,每读入一个新的数据,都要递归地与该最大值判定,最底层时更新信息,得到结果。(2)线段树输入数据较多,不宜使用C++输入输出数据流(会超时的)。(3)多开了一个数组,没有赋初值,直接运算,但并没有对结果产生影响(独立的变量,不影响其他数的值),结果判定为WA。。。(4)注意到一个优化:h=min(h, n);否则要开一个1亿的数组,显然是不现实的。具..
阅读全文
poj 3468 A Simple Problem with Integers (线段树)(*****)
摘要:http://poj.org/problem?id=3468(1)求和的线段树,注意某些数据用__int64 类型,这里用到了延迟操作(事先打标记,时候用到时处理),即 pushdown 和 mark数组 的使用。(2)为什么我的代码吃吃未能通过。。。通过的代码:View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;typedef struct{ int l,r,lazy; long long num,tag;}Tree;Tree tree
阅读全文
hdu 4000 (Fruit Ninja )(树状数组+数学知识)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4000(1)核心算法:插入一个数 x ,求已插入的比 x 小的数的个数。(2)核心数学知识:要求的满足 i<j<k && x<z<y 的(x, y, z)的组数。下面简写数学小知识:x<z<y = x<y?z - x<y<z; 其中,y?z 表示 y, z 的大小没有确定。更多的数学处理详见代码。(3)考虑过更新时是update(a-1),还是update(a),这取决于更新和调用的顺序,顺序变了,代码自然变了一点点。这里附上代码2,一边比
阅读全文
poj 2481 Cows(树状数组)
摘要:http://poj.org/problem?id=2481(1)对树状数组不熟练,但本题是最基本的树状数组。(2)和星星那题本质一样,求比 x 大的其他已经入树的 x 的个数。只是多了一个排序处理 而已。(3)之前没有进行排序,工作量特别大,效率很低,而且变量特别多,理解起来也比较吃力。 所以,排序处理是十分必要的。这里附上超时的代码。具体代码:View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=101000;i
阅读全文
hdu 1394 Minimum Inversion Number (线段树求逆序数)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1394(1)先构造一棵线段树(初始化),然后按先后顺序依次处理每一个数。对每一个数需要两种操作: 1)查询已经入树的比该数大的数的个数; 2)将该数插入到线段树中。 (2)尝试过将1)和2)合并,只写一个函数,AC了。详细操作见代码2 。具体代码:View Code #include<stdio.h>#include<string.h>#include<algorithm>#define lson l, m, rt<<1#define rson m+1, r,
阅读全文
hdu 1166 敌兵布阵(线段树基本操作)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1166(1)纯属敲模版,没有什么特别的。错了两次:一次是TLE,原因是输出了不该输出的(测试用的,忘了删掉);另一次WA,原因是没有输出该输出的(cas)。具体代码:View Code #include<stdio.h>#include<string.h>#include<algorithm>#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1using namespace std;const in
阅读全文
uva 401(Palindromes)(回文字符串)
摘要:(1)镜面、回文字符串判定,简单的字符串问题,uva上的第一交,AC。(2)开数组记录较为凌乱的数据,常用的手段。具体代码:View Code #include<stdio.h>#include<string.h>char map1[]="ABCD EFG HIJK LMN PQR STUVWXYZ1234 567 89 ";char map2[]="A BCD3 FGHIL KJM N PQR2TUVWXY51SE 4Z 678 9" ;char str[100];int cmp1(int x, int y){ return s
阅读全文
poj 2352/zstu3106 Star(线段树基本题)
摘要:http://poj.org/problem?id=2352http://acm.zstu.edu.cn:8080/JudgeOnline/showproblem?problem_id=3106(1)解题时想用上线段树,题中数据已经排好序了,排序以 y 为主,以 x 为辅。而每颗星星的等级是两个坐标均不大于该星星的总数目(不包括自己), 所以 y 的值是“无用的数据”。只需要知道有多少个其他星星的 x 小于该星星自身的 x ,即为该星星的等级数。可以用线段树加速这个过程。(2)第一种方法用的不是线段树: 1)神奇的位运算:int lowbit(int x){ return x&(...
阅读全文
zstu 2585 骑士问题(简单的bfs)
摘要:http://acm.zstu.edu.cn:8080/JudgeOnline/showproblem?problem_id=2585(1)非常基本的类型。(2)写时把e, s 弄混了, 而且条件:if(s.x<=0||s.x>8||s.y<=0||s.y>8||map[s.x][s.y]) 写成了:if(s.x<0||s.x>8||s.y<0||s.y>8||map[s.x][s.y])具体代码:View Code #include<stdio.h>#include<string.h>#include<queue&
阅读全文
poj 2777/ zstu 3109 Count Color(线段树)
摘要:http://poj.org/problem?id=2777http://acm.zstu.edu.cn:8080/JudgeOnline/showproblem?problem_id=3109(1)给指定的区间重新染色、统计不同颜色数。难点在于如何有效地重新染色。这里用到了 pushdown() 函数,即不在本次全部更新,而是设置标志数组 (color[]),在下次要访问的时候加上 pushdown() 函数。(要更新,下次,而且用到了才更新。)(2)有一个细节,输入的 a, b 需要预处理 if(a>b) {int x=a;a=b;b=x;} (否则,必然会WA。。)具体代码:Vie
阅读全文
hdu 1754/zstu 3121 I Hate It(线段树)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1754http://acm.zstu.edu.cn:8080/JudgeOnline/showproblem?problem_id=3121(1)线段树的基本操作:建树,查询,更新。(2)重新写一遍时,发现有个比较神奇的超时:假如主函数中少写了:for(i=1;i<=m;i++) 案例是可以过的,提交状态为TLE。。(这种情况与输入的结构有关,起初还以为是其它函数功能没写好)(3)又写了一遍,把操作次数的循环写成了(RE):for(i=1;i<=n;i++)具体代码:View Code #incl
阅读全文
poj 3087 Shuffle'm Up (简单的dfs)
摘要:http://poj.org/problem?id=3087(1)老实说,这是一道十分基本的dfs,但是写题时花的时间还是挺长的。 1)第一次输入没弄好,少了一个%s,且将字符串转化为一串整数(事实上没有这个必要),而且转化时还错误地默认时两色的。。 2)对于无解的处理,一开始是认定,无解时存在周期,而且第一次的洗牌结果会再次出现。前者是对的,但后者是错的(事实上也没有证明过)。 后来用一个计数变量控制深搜的次数在100000次以内,超过次数的默认无解,搞定了(本想WA的说,看来此种思想还是可行的)。具体代码:View Code #include<stdio.h>#inc...
阅读全文
poj 3126 Prime Path(简单的bfs)
摘要:http://poj.org/problem?id=3126(1)简单的bfs,注意千位不能为0,其他位置可以为0 。(写时没有充分注意这一点,而且也没有养成足够强的修改代码的能力)。具体代码:View Code #include<stdio.h>#include<math.h>#include<string.h>#include<queue>using namespace std;int a, b, flag;int mark[12000];struct node{ int n, t;}e, s;int is_prime(int n){ int
阅读全文
poj 1426 Find The Multiple (dfs)
摘要:http://poj.org/problem?id=1426(1)用了结构体加上优先队列:struct node{ int n, v, digit; node *pre;} 注意到深度为100,内存不足。。(字典树深度为10,深度没有这么大)。(2)从小到大枚举01序列,超时。(3)深搜,将部分的0替换成1,可以认为是一种技巧性的枚举,AC。具体代码:View Code #include<stdio.h>#include<string.h>int m, flag;int re[120];int yes(){ int i, c=0; for(i=1;i<=100;i
阅读全文
poj 3278 Catch That Cow (简单的bfs)
摘要:http://poj.org/problem?id=3278(1)稍微考虑就可以知道,要用广搜,广搜次数也不需要控制(因为一定会在远小于10万次以内找到)。(2)有一次RE,*2时没有判断是否超出10万。具体代码:View Code #include<stdio.h>#include<string.h>#include<queue>using namespace std;int n, m;struct node{ int n, t;}e, s;int mark[100100];void bfs(){ int i, j, k; memset(mark, 0,
阅读全文
poj 3009 Curling 2.0 (dfs的应用)
摘要:http://poj.org/problem?id=3009(1)这是一个用球撞石头的游戏,撞到石头,石碎球停。在规定的10次抛球机会下,若求移动到终点就赢,否则算输了(出界直接算输)。(2)每一次的深搜都有四个方向,每个方向要一直走,直到出现以下状况为止: 1)刚要抛球,被墙挡住了(该情况不能抛球); 2) 出界; 3)到达终点; 4) 撞墙。 其中只有第四种情况需要进行深搜,其他情况均不需要。(虽然这很显然,但是案例 通不过的基本上就是因为这个,千万小心)。(3)通过了所有案例,为什么还是WA??小心,注意输入 n,m 顺序问题。题中所给的案例 恰好...
阅读全文
poj 1321 棋盘问题(简单dfs)
摘要:http://poj.org/problem?id=1321(1)和八皇后问题本质时一样的,简单的dfs 。(2)写时没有处理好标记问题(最重要的就是标记)。第一次用了数组 mark[10][10] 做标记,由于没有处理好,WA很多次。 第二次写时,将标技术组定位 mark[10] 。其实就是这样简洁罢了。(3)注意 dp 时是按行进行的,如果有一行没有取到元素,就无法继续 dp ,所以要单独处理。具体代码:View Code #include<stdio.h>#include<string.h>using namespace std;char map[10][10];
阅读全文
poj 2251 Dungeon Master (简单的bfs,三维空间)
摘要:http://poj.org/problem?id=2251(1)简单题,注意用 flag 标记是否有解。(2)写时没有将第一个元素入队,导致均无解。。具体代码:View Code #include<stdio.h>#include<string.h>#include<queue>using namespace std;int n, m, l;char map[35][35][35];int mark[35][35][35];int px, py, pz;int dir[6][3]={1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-
阅读全文
poj 3083 Children of the Candy Corn (dfs+bfs)
摘要:http://poj.org/problem?id=3083(1)求绕墙向左走,绕墙向右走,最短路分别是多少。前两个深搜,最后一个广搜(墙不能走)。(2)本题的广搜是最基本的搜索,很简单。但我用了优先队列(虽然可以用,但并不需要),而且将优先队列写错了。。friend bool operator <(node a, node b){ return a.step<b.step;} 这是求“最长路”,而不是求最短路。应该是:friend bool operator <(node a, node b){ return a.step>b.step;}(3)走路的顺序是有讲究的,
阅读全文
poj 2488 A Knight's Journey (简单dfs+打印路径)
摘要:http://poj.org/problem?id=2488(1)注意输入 n,m 顺序,不能弄反了(好几次没注意)。(2) 搜索深度为n*m 或还是n*m-1 要注意判断。(3)打印路径关键是明确数组 after[30][30][2] 的确切含义,本质是记录一组 x, y 对应的下一组 x, y,并不复杂。但是不理解本质时,代码死活都是看不懂的。(4)初始化注意字典序问题:int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};具体代码:View Code #include<stdio.h>#include<strin
阅读全文
hdu 2546 饭卡 (01背包+贪心)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2546(1) 简单的01背包问题,但是只要有5元钱就可以买菜,不论菜多贵(但是才只能一样一样地买)。所以预留5元钱买最贵的菜。(2)排序时用到了:sort(a, a+n); 但是对于我的解法而言,应当是:sort(a+1, a+n+1);(3)有再循环里头用过一个 if-else 结构,并没有用贪心策略,AC了。可是代码丢了,也忘了时怎么写的。。(4)钱不够5元的直接输出结果。View Code #include<stdio.h>#include<string.h>#include&l
阅读全文
hdu 3449 Consumer(分组背包变形)**
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3449(1)本题属于分组背包的类型,但对于每一组,需先买盒子才能买物品,盒子无价值,武平才有价值(其实盒子有价值也能做)。 如何保证买入物品时已经买入了盒子,且不会出现多次买同一个盒子的悲剧呢?有一种办法是,开一个新的数组d[100100],对于每个d[i], 先买下盒子 i, 再用剩余的钱继承原有的规划结果:for(j=p;j<=w;j++) d[j]=dp[j-p]; 然后一一装入该组各个物品,得到最优的 d[i] ,最后用来更新 dp[i] 。(2)用来买盒子的钱不可用:if(d[k-c]!=-1
阅读全文
poj 1787 Charlie's Change (多重背包+记录路径)***
摘要:http://poj.org/gotoproblem?pid=1787(1)本题为一般的多重背包问题,亮点在于记录路径的方法,开了一个数组 pre[10010] 记录前一步的位置。调用时用 sum[30] 逐个累加即可(当然,这里的调用方法还有其他的各种方法)。 记录:pre[j]=j-b[i]; 调用:for(i=m;pre[i]!=-1;i=pre[i]) ans[i-pre[i]]++;(2)多重背包一如既往,用数组 used[10010] 限制,转化为01背包(或是完全背包,只是形式有点像而已,不属于而这任何一类)。(3)初始化问题: 1)将dp[i] 预处理为0。 dp...
阅读全文
poj 1742 Coins (多重背包)
摘要:http://poj.org/gotoproblem?pid=1742(1)多重背包的处理方式有两种: 1)转化为分组背包。本题用到了将硬币数转化成“1,2,4,8,... ,余数”的形式。2)转化为01背包。再开一个数组,记录每一个dp[i] 对每一种硬币的使用情况,以确保不多用硬币。(2)以运行效率而言,上一条中2)的效率高一些(我的代码前者超时,后者AC,具体原因不是特别明确)。似乎本题就是在卡时间,在时间细节设陷阱,各位请注意。 以下代码用的是转化为01背包。具体代码:View Code #include<stdio.h>#include<string.h>#i
阅读全文
poj 3260 The Fewest Coins(多重背包+完全背包)
摘要:http://poj.org/gotoproblem?pid=3260(1)多重背包的处理方式:转化为分组背包(1,2,4,8,余数)。具体细节参见代码:scanf("%d", &num[i]);tn=num[i];while(tn>0){ if(tn<x) {map[i][tot++]=tn;break;} map[i][tot++]=x; tn-=x; x*=2;}(2)接下来是装多重背包,注意细节 for(j=0;map[i][j];j++) 而不是 for(j=1;map[i][j];j++) 进而用万群被白调整,注意循环顺序:for(k=V-m
阅读全文
poj 2063 Investment(01背包变形)
摘要:http://poj.org/gotoproblem?pid=2063(1)上限 m 一直上升的 n 次01背包问题,比一般的01背包多了一重循环;(2)本题出现了各种错误:1)刚开始,没注意 m 变大会影响 dp 的上限,开了个dp[1100000], RE; 2)由于 m 的只比较大, 开了个dp[8000000],MLE(内存不够); 3)改小为dp[5000000], TLE(超时); 4)为什么要开这么大数组,好像是因为 m 太大了。。 重新读题, The value of a bond is alway...
阅读全文
poj 1252 Euro Efficiency (01背包变形)
摘要:http://poj.org/gotoproblem?pid=1252(1)不是单纯的01背包问题,硬币有去有回(即有正有负),这使得用想买你的解法,上限难以确定,所以我开了dp[10000]的数组,还未得到好的优化和解释;(2)对比两种写法:1)for(i=1;i<=6;i++) for(j=a[i];j<=N;j++) dp[j]=min(dp[j], dp[j-a[i]]+1);for(i=1;i<=6;i++) for(j=N-a[i];j>=0;j--) dp[j]=min(dp[j], dp[j+a[i]]+1); 2)for(i=1;i<=...
阅读全文
poj 1384 Piggy-Bank (完全背包)
摘要:http://poj.org/gotoproblem?pid=1384普通的完全背包问题,稍微注意: for(j=w[i];j<=f-e;j++)具体代码:View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int Inf = (1<<29);int t, e, f, n;int p[550], w[550];int dp[10100];int main(){ int i, j, k; while(scanf(&q
阅读全文
hdu 3535 AreYouBusy(三种背包)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3535(1)本题是三种背包的综合应用, 至少选一种、最多选一种、任意选;(2)边读入边处理,可以节省一定的空间,也是代码更加清晰(如 m 就不用开数组m[120]);(3)初始化细节: 1)for(j=0;j<=t;j++) dp[i][j]=-(1<<28); 2)for(j=0;j<=t;j++) dp[i][j]=dp[i-1][j]; 3)for(j=0;j<=t;j++) dp[i][j]=dp[i-1][j]; 写题时, 我用了for(j=0...
阅读全文
hdu 1712 ACboy needs your help(分组背包)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1712(1)本题为分组背包问题,是基本类型。dp的核心是:for(i=1;i<=n;i++) for(j=1;j<=m;j++) for(k=m;k>=j;k--) dp[i][k]=max(dp[i][k], dp[i-1][k-j]+a[i][j]), dp[i][k]=max(dp[i][k], dp[i-1][k]); //被我忽略的一行我在写这题时,少掉了最后一行,一直WA,本质上是要对dp[i][k]赋予初值dp[i-1][k]:f...
阅读全文
hdu 3033 I love sneakers!(分组背包)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3033(1)本题为分组背包问题,输入时将数据存入到结构体中:struct node{ int p[120], v[120], tot;}brand[12];(2)每组至少要取一个,处理方式不叫特殊,自然也是本题的关键。首先要初始化:for(i=1;i<12;i++) for(j=0;j<=m;j++) dp[i][j]=-(1<<28);即除了 i=0 以外,均是非法数据(注意,i=0 的一组千万不能赋负无穷)。之后是核心的部分:for(i=1;i<=k;i++) for(j=.
阅读全文
hdu 2955 Robberies(01背包)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2955(1)概率的预处理(常识):rp[i]=1-rp[i],并将概率相乘。若将概率相加(定式思维),案例是可以全过的,就麻烦了。。(2)初始化dp数组:偷走0百万是安全的,这很关键(dp[0]=1),其他的都是危险的(dp[i]=0),因为背包必须装满;(3)用sum 记录最大可能出现的值,结果也是从sum开始验证,符合安全条件的输出。具体代码:View Code #include<stdio.h>#include<stdio.h>#include<algorithm>u
阅读全文
hdu 1203 I NEED A OFFER!(01背包)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1203(1)用到概率的一点常识,预处理:b[i]=1-b[i];(2)注意n和m的个子含义,n为钱数, m为组数,不能错用(如初始化时将m当做n用。。)(3)此题为简单的01背包问题。具体代码:View Code #include<stdio.h>#include<stdio.h>#include<algorithm>using namespace std;int n, m;int a[11000];float b[11000], dp[11000];int main(){
阅读全文
opj 1948 Triangular Pastures(dp)
摘要:http://poj.org/problem?id=1948(1)用dp[i][j] 表示三角形的边为 i, j 存在与否,本质是对枚举的优化(dp), 另外,上限可取sum/2;(2)将 double p=sum/2.0 写错成 double p=sum/2,后果很严重;(3)存在两种更新方式: 1)for(i=1;i<=n;i++) for(j=sum/2;j>=0;j--) for(k=sum/2;k>=0;k--) { if(j>=a[i]) dp[j][k]=dp[j][k]||dp[j-a[i]][...
阅读全文
opj1837 Balance(dp)
摘要:http://poj.org/problem?id=1837(1)用dp[i][j]表示挂了 i 个重物时 平衡度为 j 的数目;(2)核心部分:for(j=1;j<=m;j++) for(k=0;k<=15000;k++) if(dp[j-1][k]) for(i=1;i<=n;i++) dp[j][k+c[i]*g[j]]+=dp[j-1][k];其中, j 表示重物编号, k 是背包, i 为所挂位置。注意循环的顺序,先确定重物,再打开背包,最后逐个转移平衡度。(3)由于力矩的变化才是本题的关键,将中间位置设为平衡位...
阅读全文
poj1191 棋盘分割(dp)
摘要:http://poj.org/problem?id=1191(1)棋盘任意分割不是这道题所要讨论的,注意到题目中提到的“不允许的分割”,故会出现 s=min(s, d(n-1, x1, y1, i, y2)+sum(i+1, y1, x2, y2)); s=min(s, sum(x1, y1, i, y2)+d(n-1, i+1, y1, x2, y2)); 这样的规划关系(横向分割时)。(2)比较两种写法: 1) float ans=d(k, 1, 1, 8, 8); ans=sqrt((float)ans/k-pow(sq...
阅读全文
poj1141 Brackets Sequence( 括号序列)(dp)
摘要:http://poj.org/problem?id=1141括号序列问题有几个注意点:(1)不能用scanf("%s", str), 而要用gets(str),因为输入可能含有空格(空序列'' "符合要求);(2)‘ l ’表示所考虑对象的长度, 从0到n-1枚举(故单独处理dp[i][i]);(3)dp[i][j]表示‘i ’到 ‘ j ’的最小长度,也可以换种意义,表示‘ i ’到‘ j ’的最小添加长度,此时所有dp[i][j]要做适当调整。具体代码:View Code #include<stdio.h>#include<s
阅读全文
zstu2462 求一元三次方程的根
摘要:http://acm.zstu.edu.cn:8080/JudgeOnline/showproblem?problem_id=2462本题用到了牛顿迭代法牛顿迭代公式 设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。
阅读全文
|
|