摘要: 题意:给定一个n * m 的矩阵(迷宫),-1 表示该位置不能通过, 1 ~ 5 表示该位置被第i个怪控制, 0 表示该位置不被任何怪控制给定起点和终点, 问Celica最少需要多少回合才能通过。当然,还有很多限制条件:1)每一个回合,Celica的初始行动值为L, 没移动一个位置,行动值-1, 当行动值减为0, 则开始下一个回合2)一旦踏入怪的所在位置,则立即会将怪杀死,怪所控制的位置也就变为0了3)当移动到一个怪所控制的位置,行动立即减为04)每到达一个位置,首先变化的是行动值, 这就意味着,如果踏入一个怪所在的位置,而且该位置是被怪所控制的情况下,那么行动值先变为0,再将怪杀死5)怪不一 阅读全文
posted @ 2013-04-10 11:15 枕边梦 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 题意:中文题目(略)分析:其实就是一个暴力的bfs, 关键是模拟移动,判连通,以及状态的表示。每个格子移动过程中,内部四个小三角的相对顺序是不变的,也就是移动过程中,格子是作为一个整体在移动的,,小三角只是在判连通时才用到,所以状态的表示可以将每个格子作为一个整体,这样的话,总共就是9个格子,用0~8表示,这样是否很熟悉了? 可以用类似八数码的哈希方法,用康托展开将每一个状态hash到一个整数上,剩下的就是模拟了。很惭愧,单是敲这个代码就用了快俩个小时……hdu4531#include<iostream>#include<algorithm>#include<st 阅读全文
posted @ 2013-04-07 02:07 枕边梦 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 题意:略分析:记忆化搜索用dp[i][j] 表示 i 次攻击得到少于j分的方案hdu4504#include<iostream>#include<algorithm>#include<stdio.h>#include<stdlib.h>#include<string.h>using namespace std;const int N = 20 + 5;const int M = 600 + 10;__int64 f[N];__int64 dp[N][M];int s[3] = {1, 2, 3};void init(){ f[0] = 阅读全文
posted @ 2013-04-06 18:52 枕边梦 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 题意:忽略题目背景,就是要收集最多的钱, 如果第i天拿到了si 的钱, 那么第i+x[i] 天 到 第i + y[i] - 1 天必须再拿一次,否则就再也拿不到钱了,当然,第i +x[i]天之前也是拿不到的, 题目要求第一天必须拿。。分析:一开始想到了用记忆化搜索,代码很短, 一下就敲完了, 结果也果断超时了后来想到了按记忆化搜索的思路,直接从最后一天开始算起,用dp[i] 表示第i天拿到了钱之后,到第n天为止,最多拿到的钱数,那么dp[i] = s[i] + max(dp[j]) (i + x[i] <= j <= i + y[i] - 1)到这一步就很明显了,这里涉及到了区间最 阅读全文
posted @ 2013-04-06 15:48 枕边梦 阅读(261) 评论(0) 推荐(0) 编辑
摘要: 题意:给定N 个字符串,每个字符串长度为小于等于10 ,要求得到一个排列,s[i] 为str[i] 和str[i - 1] 通过移动,相同位置上相同字符的个数,求max(s[1] + s[2] + s[3] +...)分析:aaa 和 abc 的相同的字符数 为1abc 和 adc 相同的字符数为2cde 和 bfcde 相同的字符数为3N个总数只有10, 很容易就想到了状态压缩,我们用dp[j][i]表示以第一个串结尾, 状态为j时 最大的相同字符数, j 的二进制位上每一个位的0 或1 表示是否已选了第几个串pku2817#include<iostream>#include&l 阅读全文
posted @ 2013-04-06 15:45 枕边梦 阅读(329) 评论(0) 推荐(0) 编辑
摘要: 题意:在空间中给定n个点,给出每个点的三维坐标,以及每个点上已有的花的数目Fi,和可以从该点上移走的花的数目Li,因为每一次可以移动的距离有限,为R, 所以可以选择一个中介点进行转移,最后将所有的花都移动到第一个点上。因为可以从每个点上移走的花的数目有限,所以,可以通过修改每次可以移动的距离R, 使得最终可以将所有的花移动到第一个点。 求最小的R。 若不存在,这输出-1分析:求最小的R, 我们可以二分,转化为判定性问题。 如果已知R, 问是否能将所有的花移动到第一个点呢? 问题是否好解决一点了?? 将所有的花移动到第一个点,其实就是一个很明显的网络流判是否满流的问题了。问题就是构图了。虚拟一个 阅读全文
posted @ 2013-04-03 13:18 枕边梦 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 题意:N个人排成一队,每个人从1 ~ m 中选择一个数,如果相邻的俩个人选择同一个数,则这个数必须大于K, 问总共有多少种选择方式分析:注意到n的大小,就算0(n) 的算法,都可能超时。。选不考虑这个问题,,,首先应该注意到的是,第n个人对数的选择只与第n - 1个人有关,所以针对状态转移方程下手 我们用f[n][0] 表示长度为n, 最后一个数字小于等于k 的方案数, f[n][1] 表示长度为n ,最后一个数字大于k 的方案数状态转移方程如下:f[n][0] = f[n - 1][0] * ( k - 1) + f[n - 1][1] * k;f[n][1] = f[n - 1][0] * 阅读全文
posted @ 2013-04-03 13:01 枕边梦 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一棵有根树,节点标号为1 ~ n, 根节点固定为1, 每个节点初始值为0。 总共给定M 个操作操作1:o node 将以node 为根的子树的所有节点的值取反,其实就是一个异或操作操作2:q node 问以node为跟的子树的所有节点值为1的总数分析:对做过LCA 转RMQ的应该能想到一点,如果从根节点深搜一遍得到的欧拉序列,仔细观察一下可以发现,每个节点在欧拉序列上其实对应这一个区间,这样就将对子树的操作转移到了对区间的操作。 做完这一步处理之后,熟悉线段树的同学应该就可以解决了,事实上接下来的操作比之前比赛的一道线段树很像。。线段树的每一个节点保存该节点对应区间上1的个数cn.. 阅读全文
posted @ 2013-04-03 12:41 枕边梦 阅读(176) 评论(0) 推荐(0) 编辑
摘要: hdu4527 玩转十滴水题意很明显,而且需要注意的地方在第一个测试例子已经有所体现了。就是同一时刻可能有多个水滴到达一个点,而且该位置的水滴爆破了,但也只会产生四个方向各一个水滴所以,必须处理好同一个时刻的水滴,所以用了俩个队列来处理,将同一个时刻的水滴放在一个队列中,让所有水滴都飞行一个单位时间,如果没有碰到水滴,则压入另一个队列,如果碰到了,则在该位置直接加1, 等处理完其他同一时刻的水滴之后,再判断是否存在会爆的水滴,如果会,则再产生四个水滴,压入另一个队列,以此类推,,具体看代码:hdu4527#include<iostream>#include<algorithm 阅读全文
posted @ 2013-04-02 15:33 枕边梦 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 题意:题目的意思很简单,给定一个序列,求最大递增子序列的长度,同时相邻俩项下标的差值必须大于d分析:就题意而已,只是在最长递增子序列的加了一个限制条件,沿用最长递增子序列的思路,则dp[i] = max(dp[i], dp[j] + 1), (i - j > d && a[i] > a[j])从状态转移方程可以看出,问题的关键在于维护区间(0,i - d - 1) 最大的dp值,且对应值小于a[i]我们换一种角度,用a[i]的值作为下标,保证当前区间(0, a[i] - 1)中的dp值都满足 (i - j > d) , 那么dp[i] 就等于区间(0, a[i 阅读全文
posted @ 2013-04-01 21:38 枕边梦 阅读(299) 评论(0) 推荐(0) 编辑