July_18 POJ3649 模拟题。 这个题加深了我对于模拟题的理解。 关键在于读懂题意,思路清晰。 这个题目的关键在于理解题,然后计算移动:先计算每个图形的最左最右位置,再把
每一格把所有的图形按规则计算向左移动的格数,然后再根据移动的最左坐标建立新
图像,最后根据规则去掉不输出的前导后续空白输出,一直在做算术。 July_22 POJ3662 这个题目很好。 题目意思是对于一个图求一条从源点到终点的路径满足:第k+1长的边最短。 当时想了半天也只想到优先队列广搜,结果自己代码能力挫+比赛中还有另一题卡
着,没有做出来(这样是可以的,NUDT的Alpc55就这么过了,代码能力牛!)。 后来晚上想到二分一个len,然后把距离大于len的边全部赋值为0(其实就是作
Dijstra的时候判断),小于的赋值为1,求最短路是否与k的关系。 图模型的转换博大精深…… July_23 POJ2866 树形DP 这个题思路没什么好说的,关键地方在于看到题目提到几何坐标时不要怕:这个题目
我开始时有点怕,不过看完之后一下就想到思路了——如果开始怕几何那么这个题目
就会很晚出了。 July_23 POJ2547 No Tipping 集合DP。 比赛时候没做出来——当时我们估计了搜索的时间复杂度明显不行,然后还是写了! 其实看到数据<=20应该就要敏感点地知道要集合DP了,想到这里就好办了。 没有trick的题目:不过对数据的敏感和集合DP的思想意识要加强。 July_23 POJ1103 Maze 在TOJ跟ALPC做比赛的题目,当时想出来的——这个题目关键在于建图,而建
图的关键在于标号:按照题意划分区域,‘/’和‘/'分别代表不同的涉及的四个区
域的不同连接关系。 最后可以证明除了边界区域,一个区域与正好两个区域相连通,故建图后先从边
界区域出发dfs将所有能到达的区域标记出为访问,然后再以没有访问过的点开始
dfs走圈计数。 还不错的一道题。 July_23 POJ2169 图模型转换+最短路 题目的模型转化思想很经典:原来给的就是一个图,但是要选择两个相邻(有边直接
相连)的顶点——一个状态,从一个状态可以依照条件通过一定步数转移到另一个合
法状态, 求从一个初始状态到终结状态的最少步数。 转化思想:建立一个新图,将原图的一条边转化为新图中的一个顶点,对于原图中每
个合法的转移建立一条有向边,然后在新图中求s-t最短路。 trick:这个题比赛时我们虽然想到解法,但代码能力问题加卡其他题,并未做出此
题。 赛后在TOJ将它AC后到POJ提交发现TLE,然后在ZOJ发现MLE。 后来发现我用了new,POJ又把卡new了,然后改成数组就过了。 至于ZOJ,目前还是MLE,我用了40000K左右内存,它自由32767k!可见我
的模型还不够好…… 待改进. 通过这个题的经验,又把原来卡的3013也过了。 通过好几个题:3013 3159 2169 发现如果遇到图论题,还是不要用new malloc的好,数组模拟指针还是快很多——
虽然没那么方便。 July_24 POJ1885 线段树模型 今天跟alpc在TOJ做比赛的题目,好题一道。 题目的模型是现椴树,读入单词为插入节点,遇到数字后在前边找节点,再将前
边的单词复制过来到最后一个位置(当前,而且不必真的复制,直接保存一个link
就可以了),并标记找到原单词从列表中去除。 这个题有个trick:输入的文件中最多10000个单词,但是数字却非常多,最后得
到的结果单词数比10000大很多…… July_24 Software Company 二分+DP。 先二分一个时间上界T,然后DP看是否可以在T时间内做完所有子工程。 状态表示及转移: f[k+1][t][i]表示前k个人都用了时间T工作,第k+1个人工作t时间时完成i个A公
司的项目时最多能完成B 公司项目数目。 f[k+1][0][i] = f[k][T][i]; f[k][t][i] = max(f[k][t-1][i], f[k][ t-cost[k][A] ][i-1],
f[k][ t-cost[k][B] ][i]+1); dp好想,二分的思想很重要。 July_25 POJ3666 DP+离散化 做得很不爽的一道题——我太sb了,居然被数据蒙骗了,没有想到什么好方法,直到
比赛还剩下20多分钟才想到离散话,加上代码速度慢了点,没有写出来。 对题意的挖掘最重要的一点在于: 一个点的最后高度Bi必定是A数组中的某个高度——可以证明:一个点要么保持原
有高度,要么向上或向下到最接近他的高度。 离散化后就是O(n^2)的DP,加点优化(记录一下前一个点的高度小于(大于)某个
高度的最小值)就好了。 Jul_27 POJ3667 Hotel 很好的线段树题目——一个比赛时留下的怨念:当时大家都没想法,我试着敲这
个题目,结果TLE了。 这个题目我的想法是对的:直接维护线段树(区间树)的查找、删除、添加操作。 由于查找的是大于指定长度k的最左空白的连续区间,故节点有lmax,rmax,cmax三
个值,还有必要的区间长度、范围的信息(这个一个可以推另一个)。 TLE的原因很弱智:对于一个区间整体的覆盖或删除不必先下到子区间,等要改变
子区间时才将区间信息往下传;合并子区间也是麻烦的(不过当时写对了),细细推
敲就可以了。 区间合并和信息下传的思想! July_29 Sudoku数独 exact cover problem(覆盖模型) POJ3076 POJ2676 POJ3074 前段看了Knuth的Dancing Links的论文大致了解了一下阿,昨天看了下mmd的集
训论文,试着把Hust OJ上的1017那个extra Cover problem给过了,然后今天就
开始写mmd推荐的sudoku。 数独转化为extra cover的模型(以9*9为例): 行代表每个格子要填的数的可能:9*9*9 列代表限制条件: 81+9*9+9*9+9*9 //限制1:一个格子一个数 //限制2:一列数不重复 //限制3:一行数不重复 //限制4:一个3*3的块数不重复 Jul_30 POJ 2252 一阶方程求解 重点在于对表达式求值 由于一定不高于一阶,可以用复数的表示方法存储。 这类题目都做出套路了:递归。 加深对“编译原理”的理解。 July_30 POJ2677 Tour 经典DP CLRS上的题目 模拟两个人走来解 状态设计:f[i][j](j<i) f[i][j] = min(f[i-1][k]+dis[k][i]) k=1,2,...,i-2 j=i-1 f[i][j] = f[i-1][j]+dis[i-1][i] j<i-1