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