最近看了一些有关思维题的博客(博客地址如下),认识到了自己知识积累太少以及对程序运行情况有一些认知偏差。
读了这些题,最大的感受是作者的代码写的很灵活,几乎每道题都能从我难以想到的地方切入,我觉得这是因为大量知识和题的积累,因此,想要做好思维题就必须多阅读材料,多做题,下面写一写我对每道题的理解和学到的东西(思路作者有写)
第1道题应该是动态规划一道经典题求最大子段和的变形,作者这里应该也是用了类似的思想。
第2道题没想到可以用什么算法思想,也没有看出作者用了什么算法思想,应该是作者找到了题目的规律,后查阅了一下资料发现这道题可以用dp做,思路就是设一个数组l[i]表示1-i包含v的个数,另一个数组r[i]表示i-n包含v的个数遍历字符串,遇到o,就累加l[i-1]*r[i+1]
第3道题还是没有看出可以用什么算法思想,应该是一道总结规律的题目
第4题提到“最少翻面多少次”想到最优解问题,从而可以想到贪心和动态规划,因为据题意分析可知该题只要找到局部最优解就可以得到整体最优解,所以更适合用贪心
第5题求最小值想到贪心和dp,但因为每次选取的数即使大最后或运算后也可能小,所以排除贪心(查阅资料后发现确实可以用dp),作者这里用了枚举法,做法更简单(所以算法思想不能只局限于那五种)
第6题看到最值问题我首先想到了贪心和dp,但看了一下题目感觉两个都不太合适,作者这里用了暴力枚举。
第7题没看出用什么思想,查阅资料发现有用分治思想里的二分法的,作者在这里应该是总结了题目的规律,在这里“const int inf = 0x3f3f3f3f;”是acm中常用的无穷大常量。
第8题只想到了贪心,作者还提到了dp解这道题的思想
第9题是一道纯纯的思维题,就是找题目的规律
第10题没看出来用什么思想,作者用了dp
看完这10道题,说实话感觉收获一般,只是勉强看出了几道题该用什么法做,看了一下别人代码的写法,但是因为代码写的很灵活一时半会也学不来,也因为时间关系还没有按照自己的思路写写试试,但是也有了一定的题的积累量,再碰到类似的题时也不会没有思路了。