这十来天练了些简单DP和简单搜索。
基础搜索
poj 1321 DFS,设一个数组re[]记录某一列是否放过棋子,然后再for()循环一行一行判断是否可以放棋子。
poj 2251 BFS,这个看好题意就好了,一个简单的BFS,只不过每一步有6种可能。
hdoj 2717 BFS,一步有三种可能,进一步,退一步,或者跨越一倍的步数。不过这题有一个要注意的地方,就是初始时,人和牛就在同一个位置的情况。这一个要单独列出来。其实人的位置大于等于牛的位置的时候,最少步数就是m-n,单独列出来就好了。
poj 3279 这道题我不知道为什么放到搜索里。我觉得就是一个熄灯问题,枚举第一行的状态,之后再进行相应的操作就好了。
poj 1426 刚看到这道题的时候我以为数据会很大,其实long long就可以过了。我用的是BFS,初始是1,之后下一位可能是1也可能是0,然后逐步判断是否是其倍数就好了。题目不要求一定和样例一样...满足要求即可。不过很奇怪的是,用C++交TLE,G++就可以过。很迷。
poj 1973 这个...BFS,有点繁琐。从改变个位开始一直到改变千位,判断是否是素数,是素数就入队,然后判断是否和相应的数相等。
poj 3087 这一个,感觉和搜索的关系也不是很大- -.....用C++里的string类比较好操作。先取从s2底端取再从S1底端取,那就是一个for( s+=s2,s+=s1);然后再判断s是否和给定字符串相等,不相等就将底部的C个字符给s2,顶部C个字符给s1。之后再重复操作。当组合的字符串与给定字符串相等,或者是之前已出现过的字符串时结束循环。前者代表可以,后者不行。
poj 3414&&hdoj1495&&poj3984 BFS。这三道题其实就是简单的BFS。不过这麻烦的是要输出路径,再设个数组,维护一下就好了。
hdoj 1241 这题我是遍历这个图,然后发现有油并且我之前没有走过这我就判断他四周是否有连着的油田,也就是遍历其四周的情况。同时如果他四周有油田,则将那个位置入队,之后再重复上述操作,相当于一个BFS吧。
uva11624 BFS。这道题因为火和人都可以移动。所以要搞两次BFS。其实这火的移动,在一开始火源确定的情况下就已经确定好了。所以我们设一个数组,用以记录地图上某时某地会出现火情。然后人在走的时候就得再加一个判断条件:判断当人走到这里的时候,这里有没有火情。之后就是普通的BFS操作了。
基础DP
poj 2533 最长上升子序列。设一个数组记录以第I位结尾的最长上升子序列的长度就好了。
hdoj 1159 最长公共子序列。设一个二维数组记录第一个字符串以I位结尾,第二个字符串以j位结尾的最长公共子序列的长度。
poj 3186 设一个二维数组记录从头部取I次,从尾部取j次所得到的价值。
poj 3187 这一个用STL里的next_permutation()函数就好了。
poj 1088 枚举各个点作为起点的情况,之后用DFS。不过要设一个二维数组记录从这一点开始的值,之后若是重复遇到同一个点则return,直接DFS会超时。
poj 3616 最长上升子序列的变形。不过这里要先按开始挤奶的先后顺序排序。
hdoj 1003 最大子序列和。设一个数组记录以第I位结尾的和就好了。这里还要求输出起点和终点,我是记录终点,之后再逆推回去,求得起点。
hdoj 1029 求哪一个元素出现次数大于N/2。设一个变量count,记录一个数max出现的次数,再设一个变量记录这时候是在记录哪一个数。当数据==max的时候count++,!=的时候count--,当count==0的时候,max=数据,count++。
hdoj 1087 最长递增序列和。
hdoj 1069 最长上升序列的变形。一个长方体相当于6块不同的长方体。
hdoj 1176 数塔。从最后一秒开始往最开始递推。
hdoj 1260 比较一下是两个人买得块还是一个人买得快就好了。设一个数组记录一下前I个人买票所需时间。
hdoj 1114 完全背包问题。
hdoj 1257 求有几段递减序列。设一个数组记录第I段序列的最小值就好了。
hdoj 1160 最长上升序列变形。先排下序就好了。
hdoj 1078 和poj1088解法类似。DFS加数组记录。